mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Rework csv import preview with additional cleanups
- The preview part should be less chaotic now. It already has an option for future multi-split import functionality, but that's not used yet - rename a few variables - change semantics on start/end lines; this is now communicated in number of lines to skip - avoid a couple of double value storing (once in the assistant object and onece in the import object)
This commit is contained in:
committed by
Geert Janssens
parent
056d20c1f7
commit
4f2980ef42
@@ -84,18 +84,15 @@ typedef struct
|
||||
GtkWidget *preview_page; /**< Assistant preview page widget */
|
||||
GtkWidget *settings_combo; /**< The Settings Combo */
|
||||
GtkWidget *combo_hbox; /**< The Settings Combo hbox */
|
||||
GtkWidget *check_label; /**< The widget for the check label */
|
||||
GtkWidget *check_butt; /**< The widget for the check label button */
|
||||
GtkWidget *start_row_spin; /**< The widget for the start row spinner */
|
||||
GtkWidget *end_row_spin; /**< The widget for the end row spinner */
|
||||
GtkWidget *skip_rows; /**< The widget for Skip alternate rows from start row */
|
||||
GtkWidget *csv_button; /**< The widget for the CSV button */
|
||||
GtkWidget *fixed_button; /**< The widget for the Fixed Width button */
|
||||
int start_row; /**< The liststore start row, smallest is 0 */
|
||||
int end_row; /**< The liststore end row, max number of rows -1 */
|
||||
int home_account_number; /**< The number of unique home account strings */
|
||||
|
||||
GncTxImport *parse_data; /**< The actual data we are previewing */
|
||||
GncTxImport *parse_data; /**< The actual data we are previewing */
|
||||
CsvSettings *settings_data; /**< The settings to be saved and loaded */
|
||||
GOCharmapSel *encselector; /**< The widget for selecting the encoding */
|
||||
GtkCheckButton *sep_buttons[SEP_NUM_OF_TYPES]; /**< Checkbuttons for common separators */
|
||||
@@ -116,8 +113,6 @@ typedef struct
|
||||
* 2. encoding_selected is called twice,
|
||||
* each time decrementing this by 1. */
|
||||
bool skip_errors; /**< This is false until the user checks the skip errors. */
|
||||
int num_of_rows; /**< The number of rows in the store */
|
||||
int longest_line; /**< The length of the longest row */
|
||||
int fixed_context_col; /**< The number of the column whose the user has clicked */
|
||||
int fixed_context_dx; /**< The horizontal coordinate of the pixel in the header of the column
|
||||
* the user has clicked */
|
||||
@@ -233,18 +228,21 @@ csv_import_trans_load_settings (CsvImportTrans *info)
|
||||
g_free (group);
|
||||
|
||||
// Set start row
|
||||
info->parse_data->start_row = info->settings_data->header_rows;
|
||||
info->parse_data->skip_start_lines = info->settings_data->header_rows;
|
||||
GtkAdjustment *adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), info->settings_data->header_rows);
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size());
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin),
|
||||
info->settings_data->header_rows);
|
||||
|
||||
// Set end row
|
||||
info->parse_data->end_row = info->num_of_rows - info->settings_data->footer_rows;
|
||||
info->parse_data->skip_end_lines = info->settings_data->footer_rows;
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
gtk_adjustment_set_upper (adj, info->num_of_rows);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), info->num_of_rows - info->settings_data->footer_rows);
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size());
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin),
|
||||
info->settings_data->footer_rows);
|
||||
|
||||
// Set Alternate rows
|
||||
info->parse_data->skip_rows = info->settings_data->skip_alt_rows;
|
||||
info->parse_data->skip_alt_lines = info->settings_data->skip_alt_rows;
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->skip_rows), info->settings_data->skip_alt_rows);
|
||||
|
||||
// Set Import Format
|
||||
@@ -539,7 +537,7 @@ csv_import_trans_save_settings_cb (GtkWidget *button, CsvImportTrans *info)
|
||||
|
||||
/* This section deals with the header and rows */
|
||||
info->settings_data->header_rows = gtk_spin_button_get_value (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
info->settings_data->footer_rows = info->num_of_rows - gtk_spin_button_get_value (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
info->settings_data->footer_rows = gtk_spin_button_get_value (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
info->settings_data->skip_alt_rows = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->skip_rows));
|
||||
info->settings_data->csv_format = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(info->csv_button));
|
||||
|
||||
@@ -718,6 +716,17 @@ csv_import_trans_file_chooser_confirm_cb (GtkWidget *button, CsvImportTrans *inf
|
||||
info->parse_data = parse_data;
|
||||
info->previewing_errors = false; /* We're looking at all the data. */
|
||||
info->skip_errors = false; // Set skip_errors to False
|
||||
|
||||
/* Reset a couple of widgets on the preview page */
|
||||
// - leading and trailing lines to skip = 0
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 0);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), 0);
|
||||
|
||||
/* Get settings store and populate */
|
||||
GtkTreeModel *settings_store = gtk_combo_box_get_model (GTK_COMBO_BOX(info->settings_combo));
|
||||
gnc_csv_trans_find_settings (settings_store);
|
||||
gtk_combo_box_set_active (GTK_COMBO_BOX(info->settings_combo), 0);
|
||||
|
||||
gtk_assistant_set_page_complete (assistant, page, TRUE);
|
||||
gtk_assistant_set_current_page (assistant, num + 1);
|
||||
}
|
||||
@@ -731,73 +740,25 @@ csv_import_trans_file_chooser_confirm_cb (GtkWidget *button, CsvImportTrans *inf
|
||||
static
|
||||
void row_selection_update (CsvImportTrans* info)
|
||||
{
|
||||
GtkListStore *store;
|
||||
GtkTreeIter iter;
|
||||
bool valid;
|
||||
int i = 0;
|
||||
auto store = GTK_LIST_STORE(gtk_tree_view_get_model (info->treeview));
|
||||
|
||||
store = GTK_LIST_STORE(gtk_tree_view_get_model (info->treeview));
|
||||
|
||||
/* Start of file */
|
||||
for (i = 0; i <= info->start_row; i++)
|
||||
/* Colorize rows that will be skipped */
|
||||
for (uint i = 0; i < info->parse_data->parsed_lines.size(); i++)
|
||||
{
|
||||
/* Modify background color of rows less than start row */
|
||||
if (info->start_row == i)
|
||||
{
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, NULL, -1);
|
||||
}
|
||||
const char *color = NULL;
|
||||
if ((i < info->parse_data->skip_start_lines) || // start rows to skip
|
||||
(i >= info->parse_data->parsed_lines.size()
|
||||
- info->parse_data->skip_end_lines) || // end rows to skip
|
||||
(((i - info->parse_data->skip_start_lines) % 2 == 1) && // skip every second row...
|
||||
info->parse_data->skip_alt_lines)) // ...if requested
|
||||
color = "pink";
|
||||
else
|
||||
{
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, "pink", -1);
|
||||
valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(store), &iter);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, NULL, -1);
|
||||
}
|
||||
}
|
||||
color = NULL; // all other rows
|
||||
|
||||
/* End of File */
|
||||
for (i = info->num_of_rows - 1; i >= info->end_row; i--)
|
||||
{
|
||||
/* Modify background color of rows more than end row */
|
||||
if (i == info->end_row)
|
||||
{
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, NULL, -1);
|
||||
}
|
||||
else
|
||||
{
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, "pink", -1);
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i - 1);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, NULL, -1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove background color from the start row to end row */
|
||||
for (i = info->start_row + 1; i <= info->end_row; i++)
|
||||
{
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
bool valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, NULL, -1);
|
||||
}
|
||||
|
||||
/* Skip rows */
|
||||
if (info->parse_data->skip_rows)
|
||||
{
|
||||
for (i = info->start_row + 1; i <= info->end_row; i = i + 2)
|
||||
{
|
||||
/* Modify background color of alternate rows from the start row */
|
||||
valid = gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(store), &iter, NULL, i);
|
||||
if (valid)
|
||||
gtk_list_store_set (store, &iter, 0, "pink", -1);
|
||||
}
|
||||
gtk_list_store_set (store, &iter, 0, color, -1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -812,13 +773,13 @@ void csv_import_trans_srow_cb (GtkWidget *spin, gpointer user_data)
|
||||
CsvImportTrans *info = (CsvImportTrans*) user_data;
|
||||
GtkAdjustment *adj;
|
||||
|
||||
/* Get number of rows for header */
|
||||
info->start_row = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spin)) - 1;
|
||||
|
||||
info->parse_data->start_row = info->start_row;
|
||||
/* Get number of lines to skip at the beginning */
|
||||
info->parse_data->skip_start_lines = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spin));
|
||||
|
||||
/* And adjust maximum number of lines that can be skipped at the end accordingly */
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
gtk_adjustment_set_lower (adj, info->start_row + 1);
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size()
|
||||
- info->parse_data->skip_start_lines);
|
||||
|
||||
/* Refresh the row highlighting */
|
||||
row_selection_update (info);
|
||||
@@ -835,13 +796,13 @@ void csv_import_trans_erow_cb (GtkWidget *spin, gpointer user_data)
|
||||
CsvImportTrans *info = (CsvImportTrans*) user_data;
|
||||
GtkAdjustment *adj;
|
||||
|
||||
/* Get number of rows for header */
|
||||
info->end_row = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spin)) - 1;
|
||||
|
||||
info->parse_data->end_row = info->end_row + 1;
|
||||
/* Get number of lines to skip at the end */
|
||||
info->parse_data->skip_end_lines = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON(spin));
|
||||
|
||||
/* And adjust maximum number of lines that can be skipped at the beginning accordingly */
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
gtk_adjustment_set_upper (adj, info->end_row + 1);
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size()
|
||||
- info->parse_data->skip_end_lines);
|
||||
|
||||
/* Refresh the row highlighting */
|
||||
row_selection_update (info);
|
||||
@@ -873,8 +834,8 @@ void csv_import_trans_skiprows_cb (GtkWidget *checkbox, gpointer user_data)
|
||||
{
|
||||
CsvImportTrans *info = (CsvImportTrans*) user_data;
|
||||
|
||||
/* Set the skip_rows variable */
|
||||
info->parse_data->skip_rows = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbox));
|
||||
/* Set the skip_alt_lines variable */
|
||||
info->parse_data->skip_alt_lines = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(checkbox));
|
||||
|
||||
/* Refresh the row highlighting */
|
||||
row_selection_update (info);
|
||||
@@ -1470,7 +1431,7 @@ bool preview_settings_valid (CsvImportTrans* info)
|
||||
gtk_tree_model_get_iter_first (ctstore, &iter1);
|
||||
|
||||
/* Get an iterator for the first required row in the data store. */
|
||||
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(datastore), &iter2, NULL, info->start_row);
|
||||
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(datastore), &iter2, NULL, info->parse_data->skip_start_lines);
|
||||
|
||||
/* Go through each of the columns. */
|
||||
for (i = 0; i < ncols; i++)
|
||||
@@ -1602,7 +1563,7 @@ check_for_duplicates (GtkListStore *liststore, const gchar *string)
|
||||
*/
|
||||
bool get_list_of_accounts (CsvImportTrans* info, GtkTreeModel *store)
|
||||
{
|
||||
int i, j, ncols = info->parse_data->column_types.size(); /* ncols is the number of columns in the data. */
|
||||
int i, ncols = info->parse_data->column_types.size(); /* ncols is the number of columns in the data. */
|
||||
bool have_accounts = false;
|
||||
gint home_account_number = 0;
|
||||
gint other_account_number = 0;
|
||||
@@ -1617,7 +1578,9 @@ bool get_list_of_accounts (CsvImportTrans* info, GtkTreeModel *store)
|
||||
/* Get an iterator for the first (and only) row of the column store. */
|
||||
gtk_tree_model_get_iter_first (ctstore, &iter1);
|
||||
|
||||
for (j = info->start_row; j <= info->end_row; j++)
|
||||
for (uint j = info->parse_data->skip_start_lines;
|
||||
j < info->parse_data->parsed_lines.size() - info->parse_data->skip_end_lines - 1;
|
||||
j++)
|
||||
{
|
||||
/* Go through each of the columns. */
|
||||
for (i = 0; i < ncols; i++)
|
||||
@@ -1723,7 +1686,6 @@ static void gnc_csv_preview_update_assist (CsvImportTrans* info)
|
||||
g_free (bodytypes);
|
||||
|
||||
/* Fill the data liststore with data from the file. */
|
||||
info->num_of_rows = info->parse_data->parsed_lines.size();
|
||||
for (auto parse_line : info->parse_data->parsed_lines)
|
||||
{
|
||||
// When previewing errors skip all lines that don't have errors
|
||||
@@ -1870,12 +1832,13 @@ void gnc_csv_reset_preview_setting (CsvImportTrans *info, bool block)
|
||||
|
||||
// Reset Start Row
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 1);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 0);
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size());
|
||||
|
||||
// Reset End Row
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
gtk_adjustment_set_upper (adj, info->num_of_rows);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), info->num_of_rows);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), 0);
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size());
|
||||
|
||||
// Reset Skip Rows
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->skip_rows), FALSE);
|
||||
@@ -1927,7 +1890,6 @@ void gnc_csv_reset_preview_setting (CsvImportTrans *info, bool block)
|
||||
static
|
||||
void load_settings (CsvImportTrans *info)
|
||||
{
|
||||
info->start_row = 0;
|
||||
info->match_parse_run = false;
|
||||
if (!info->file_name.empty())
|
||||
info->file_name.clear();
|
||||
@@ -1971,8 +1933,6 @@ csv_import_trans_assistant_file_page_prepare (GtkAssistant *assistant,
|
||||
gpointer user_data)
|
||||
{
|
||||
CsvImportTrans *info = (CsvImportTrans*) user_data;
|
||||
GtkAdjustment *adj;
|
||||
GtkTreeModel *settings_store;
|
||||
gint num = gtk_assistant_get_current_page (assistant);
|
||||
GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
|
||||
|
||||
@@ -1983,19 +1943,6 @@ csv_import_trans_assistant_file_page_prepare (GtkAssistant *assistant,
|
||||
if (info->starting_dir.size())
|
||||
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(info->file_chooser), info->starting_dir.c_str());
|
||||
|
||||
/* Reset start row to first row 1 */
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 1);
|
||||
|
||||
/* Reset upper value to 999 */
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
gtk_adjustment_set_upper (adj, 999);
|
||||
|
||||
/* Get settings store and populate */
|
||||
settings_store = gtk_combo_box_get_model (GTK_COMBO_BOX(info->settings_combo));
|
||||
gnc_csv_trans_find_settings (settings_store);
|
||||
gtk_combo_box_set_active (GTK_COMBO_BOX(info->settings_combo), 0);
|
||||
|
||||
/* Disable the Forward Assistant Button */
|
||||
gtk_assistant_set_page_complete (assistant, page, FALSE);
|
||||
}
|
||||
@@ -2006,13 +1953,11 @@ csv_import_trans_assistant_preview_page_prepare (GtkAssistant *assistant,
|
||||
gpointer user_data)
|
||||
{
|
||||
CsvImportTrans *info = (CsvImportTrans*) user_data;
|
||||
GtkAdjustment *adj;
|
||||
|
||||
g_signal_connect (G_OBJECT(info->treeview), "size-allocate",
|
||||
G_CALLBACK(treeview_resized), (gpointer)info);
|
||||
|
||||
// Hide the check button label and toggle
|
||||
gtk_widget_hide (GTK_WIDGET(info->check_label));
|
||||
// Hide the skip errors check button
|
||||
gtk_widget_hide (GTK_WIDGET(info->check_butt));
|
||||
|
||||
if (info->previewing_errors) // We are looking at errors to display
|
||||
@@ -2030,19 +1975,18 @@ csv_import_trans_assistant_preview_page_prepare (GtkAssistant *assistant,
|
||||
gtk_widget_show (GTK_WIDGET(info->instructions_image));
|
||||
gtk_widget_show (GTK_WIDGET(info->instructions_label));
|
||||
|
||||
/* Reset start row */
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 1);
|
||||
/* Reset start and end row */
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->start_row_spin), 0);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), 0);
|
||||
|
||||
/* Set spin buttons and settings combo hbox not sensitive */
|
||||
gtk_widget_set_sensitive (info->combo_hbox, FALSE);
|
||||
gtk_widget_set_sensitive (info->start_row_spin, FALSE);
|
||||
gtk_widget_set_sensitive (info->end_row_spin, FALSE);
|
||||
gtk_widget_set_sensitive (info->skip_rows, FALSE);
|
||||
info->parse_data->skip_rows = FALSE;
|
||||
info->parse_data->skip_alt_lines = FALSE;
|
||||
|
||||
/* Show the check button label and toggle */
|
||||
gtk_widget_show (GTK_WIDGET(info->check_label));
|
||||
/* Show the skip errors check button */
|
||||
gtk_widget_show (GTK_WIDGET(info->check_butt));
|
||||
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(info->check_butt), FALSE);
|
||||
}
|
||||
@@ -2060,12 +2004,12 @@ csv_import_trans_assistant_preview_page_prepare (GtkAssistant *assistant,
|
||||
gnc_csv_preview_update_assist (info);
|
||||
|
||||
/* Set the upper limit of spin button to number of rows */
|
||||
GtkAdjustment *adj;
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->end_row_spin));
|
||||
if (gtk_adjustment_get_upper (adj) != info->num_of_rows)
|
||||
{
|
||||
gtk_adjustment_set_upper (adj, info->num_of_rows);
|
||||
gtk_spin_button_set_value (GTK_SPIN_BUTTON(info->end_row_spin), info->num_of_rows);
|
||||
}
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size());
|
||||
adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON(info->start_row_spin));
|
||||
gtk_adjustment_set_upper (adj, info->parse_data->parsed_lines.size());
|
||||
if (gtk_adjustment_get_upper (adj) != info->parse_data->parsed_lines.size())
|
||||
|
||||
/* Update the row selection highlight */
|
||||
row_selection_update (info);
|
||||
@@ -2816,9 +2760,8 @@ csv_import_trans_assistant_create (CsvImportTrans *info)
|
||||
"semicolon_cbutton",
|
||||
"hyphen_cbutton"
|
||||
};
|
||||
GtkContainer *date_format_container, *currency_format_container;
|
||||
GtkContainer *date_format_container, *currency_format_container, *encoding_container;
|
||||
int i;
|
||||
GtkTable *enctable;
|
||||
GtkListStore *settings_store;
|
||||
|
||||
info->preview_page = GTK_WIDGET(gtk_builder_get_object (builder, "preview_page"));
|
||||
@@ -2852,18 +2795,12 @@ csv_import_trans_assistant_create (CsvImportTrans *info)
|
||||
g_signal_connect (G_OBJECT(del_button), "clicked",
|
||||
G_CALLBACK(csv_import_trans_delete_settings_cb), (gpointer)info);
|
||||
|
||||
/* The table containing info->encselector and the separator configuration widgets */
|
||||
/* The table containing the separator configuration widgets */
|
||||
info->start_row_spin = GTK_WIDGET(gtk_builder_get_object (builder, "start_row"));
|
||||
info->end_row_spin = GTK_WIDGET(gtk_builder_get_object (builder, "end_row"));
|
||||
info->skip_rows = GTK_WIDGET(gtk_builder_get_object (builder, "skip_rows"));
|
||||
info->check_label = GTK_WIDGET(gtk_builder_get_object (builder, "check_label"));
|
||||
info->check_butt = GTK_WIDGET(gtk_builder_get_object (builder, "check_butt"));
|
||||
|
||||
info->encselector = GO_CHARMAP_SEL(go_charmap_sel_new(GO_CHARMAP_SEL_TO_UTF8));
|
||||
/* Connect the selector to the encoding_selected event handler. */
|
||||
g_signal_connect (G_OBJECT(info->encselector), "charmap_changed",
|
||||
G_CALLBACK(encoding_selected), (gpointer)info);
|
||||
|
||||
/* Load the separator buttons from the glade builder file into the
|
||||
* info->sep_buttons array. */
|
||||
for (i = 0; i < SEP_NUM_OF_TYPES; i++)
|
||||
@@ -2888,12 +2825,16 @@ csv_import_trans_assistant_create (CsvImportTrans *info)
|
||||
g_signal_connect (G_OBJECT(info->custom_entry), "changed",
|
||||
G_CALLBACK(sep_button_clicked), (gpointer)info);
|
||||
|
||||
/* Get the table from the Glade builder file. */
|
||||
enctable = GTK_TABLE(gtk_builder_get_object (builder, "enctable"));
|
||||
/* Put the selector in at the top. */
|
||||
gtk_table_attach_defaults (enctable, GTK_WIDGET(info->encselector), 1, 2, 0, 1);
|
||||
/* Show the table in all its glory. */
|
||||
gtk_widget_show_all (GTK_WIDGET(enctable));
|
||||
|
||||
/* Create the encoding selector widget and add it to the assistant */
|
||||
info->encselector = GO_CHARMAP_SEL(go_charmap_sel_new(GO_CHARMAP_SEL_TO_UTF8));
|
||||
/* Connect the selector to the encoding_selected event handler. */
|
||||
g_signal_connect (G_OBJECT(info->encselector), "charmap_changed",
|
||||
G_CALLBACK(encoding_selected), (gpointer)info);
|
||||
|
||||
encoding_container = GTK_CONTAINER(gtk_builder_get_object (builder, "encoding_container"));
|
||||
gtk_container_add (encoding_container, GTK_WIDGET(info->encselector));
|
||||
gtk_widget_show_all (GTK_WIDGET(encoding_container));
|
||||
|
||||
/* The instructions label and image */
|
||||
info->instructions_label = GTK_LABEL(gtk_builder_get_object (builder, "instructions_label"));
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -36,6 +36,12 @@
|
||||
#define CSV_NAME "Name"
|
||||
#define CSV_FORMAT "CsvFormat"
|
||||
#define CSV_ALT_ROWS "AltRows"
|
||||
#define CSV_SKIP_START "SkipStartRows"
|
||||
#define CSV_SKIP_END "SkipEndRows"
|
||||
|
||||
/* The following two key names are only used by gnucash 2.6
|
||||
* They have been superseded by CSV_SKIP_START and CSV_SKIP_END.
|
||||
*/
|
||||
#define CSV_START_ROW "StartRow"
|
||||
#define CSV_END_ROWS "EndRows"
|
||||
|
||||
@@ -105,14 +111,14 @@ gnc_csv_trans_find_settings (GtkTreeModel *settings_store)
|
||||
GKeyFile *keyfile;
|
||||
gchar **groups = NULL;
|
||||
gint i;
|
||||
gsize grouplenght;
|
||||
gsize grouplength;
|
||||
GError *key_error = NULL;
|
||||
|
||||
// Get the Key file
|
||||
keyfile = gnc_state_get_current ();
|
||||
|
||||
// Find all Groups
|
||||
groups = g_key_file_get_groups (keyfile, &grouplenght);
|
||||
groups = g_key_file_get_groups (keyfile, &grouplength);
|
||||
|
||||
// Clear the list store
|
||||
gtk_list_store_clear (GTK_LIST_STORE(settings_store));
|
||||
@@ -122,7 +128,7 @@ gnc_csv_trans_find_settings (GtkTreeModel *settings_store)
|
||||
gtk_list_store_set (GTK_LIST_STORE(settings_store), &iter, SET_GROUP, NULL, SET_NAME, _("No Settings"), -1);
|
||||
|
||||
// Search all Groups for ones starting with prefix
|
||||
for (i=0; i < grouplenght; i++)
|
||||
for (i=0; i < grouplength; i++)
|
||||
{
|
||||
if (g_str_has_prefix (groups[i], CSV_GROUP_PREFIX))
|
||||
{
|
||||
@@ -147,18 +153,26 @@ gnc_csv_trans_find_settings (GtkTreeModel *settings_store)
|
||||
|
||||
|
||||
/**************************************************
|
||||
* load_error
|
||||
* handle_load_error
|
||||
*
|
||||
* record the error in the log file
|
||||
* record possible errors in the log file
|
||||
* ignore key-not-found errors though. We'll just
|
||||
* use a default value and go on.
|
||||
**************************************************/
|
||||
static gboolean
|
||||
load_error (GError **key_error, gchar *group)
|
||||
handle_load_error (GError **key_error, gchar *group)
|
||||
{
|
||||
GError *kerror;
|
||||
kerror = g_error_copy (*key_error);
|
||||
g_warning ("Error reading group '%s' : %s", group, kerror->message);
|
||||
if (!*key_error)
|
||||
return FALSE;
|
||||
|
||||
if ((*key_error)->code == G_KEY_FILE_ERROR_KEY_NOT_FOUND)
|
||||
{
|
||||
g_clear_error (key_error);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_warning ("Error reading group '%s' : %s", group, (*key_error)->message);
|
||||
g_clear_error (key_error);
|
||||
g_error_free (kerror);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -181,25 +195,49 @@ gnc_csv_trans_load_settings (CsvSettings *settings_data, gchar *group)
|
||||
// Get the Key file
|
||||
keyfile = gnc_state_get_current ();
|
||||
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_START_ROW, &key_error);
|
||||
settings_data->header_rows = (key_error) ? 1 : key_int;
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_SKIP_START, &key_error);
|
||||
settings_data->header_rows = (key_error) ? 0 : key_int;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
{
|
||||
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_END_ROWS, &key_error);
|
||||
/* If the key was not found (in contrast to failing to interpret its value)
|
||||
* perhaps the file still uses the 2.6 key format. Let's check */
|
||||
gboolean tmp_err = handle_load_error (&key_error, group);
|
||||
if (!tmp_err)
|
||||
{
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_START_ROW, &key_error);
|
||||
settings_data->header_rows = (key_error) ? 0 : key_int - 1; // Old key was 1-based, new key is 0-based !
|
||||
error |= handle_load_error (&key_error, group);
|
||||
}
|
||||
else
|
||||
error |= tmp_err;
|
||||
|
||||
}
|
||||
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_SKIP_END, &key_error);
|
||||
settings_data->footer_rows = (key_error) ? 0 : key_int;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
{
|
||||
/* If the key was not found (in contrast to failing to interpret its value)
|
||||
* perhaps the file still uses the 2.6 key format. Let's check */
|
||||
gboolean tmp_err = handle_load_error (&key_error, group);
|
||||
if (!tmp_err)
|
||||
{
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_END_ROWS, &key_error);
|
||||
settings_data->footer_rows = (key_error) ? 0 : key_int; // Old key and new key are both 0-based !
|
||||
error |= handle_load_error (&key_error, group);
|
||||
}
|
||||
else
|
||||
error |= tmp_err;
|
||||
}
|
||||
|
||||
key_boolean = g_key_file_get_boolean (keyfile, group, CSV_ALT_ROWS, &key_error);
|
||||
settings_data->skip_alt_rows = (key_error) ? FALSE : key_boolean;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
key_boolean = g_key_file_get_boolean (keyfile, group, CSV_FORMAT, &key_error);
|
||||
settings_data->csv_format = (key_error) ? TRUE : key_boolean;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
for (i = 0; i < SEP_NUM_OF_TYPES; i++)
|
||||
{
|
||||
@@ -207,42 +245,34 @@ gnc_csv_trans_load_settings (CsvSettings *settings_data, gchar *group)
|
||||
sep = g_strdup_printf ("%s%d", CSV_SEP, i);
|
||||
key_boolean = g_key_file_get_boolean (keyfile, group, sep, &key_error);
|
||||
settings_data->separator[i] = (key_error) ? FALSE : key_boolean;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
g_free (sep);
|
||||
}
|
||||
|
||||
key_boolean = g_key_file_get_boolean (keyfile, group, CSV_CUSTOM, &key_error);
|
||||
settings_data->custom = (key_error) ? FALSE : key_boolean;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
settings_data->custom_entry = g_key_file_get_string (keyfile, group, CSV_CUSTOM_ENTRY, &key_error);
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_DATE, &key_error);
|
||||
settings_data->date_active = (key_error) ? 0 : key_int;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
key_int = g_key_file_get_integer (keyfile, group, CSV_CURRENCY, &key_error);
|
||||
settings_data->currency_active = (key_error) ? 0 : key_int;
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
key_char = g_key_file_get_string (keyfile, group, CSV_ENCODING, &key_error);
|
||||
settings_data->encoding = g_strdup((key_error) ? "UTF-8" : key_char);
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
settings_data->column_types = g_key_file_get_string (keyfile, group, CSV_COL_TYPES, &key_error);
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
settings_data->column_widths = g_key_file_get_string (keyfile, group, CSV_COL_WIDTHS, &key_error);
|
||||
if (key_error)
|
||||
error = load_error (&key_error, group);
|
||||
error |= handle_load_error (&key_error, group);
|
||||
|
||||
g_free (key_char);
|
||||
return error;
|
||||
@@ -304,8 +334,8 @@ gnc_csv_trans_save_settings (CsvSettings *settings_data, gchar *settings_name)
|
||||
// Start Saving the settings
|
||||
g_key_file_set_string (keyfile, group, CSV_NAME, settings_name);
|
||||
|
||||
g_key_file_set_integer (keyfile, group, CSV_START_ROW, settings_data->header_rows);
|
||||
g_key_file_set_integer (keyfile, group, CSV_END_ROWS, settings_data->footer_rows);
|
||||
g_key_file_set_integer (keyfile, group, CSV_SKIP_START, settings_data->header_rows);
|
||||
g_key_file_set_integer (keyfile, group, CSV_SKIP_END, settings_data->footer_rows);
|
||||
g_key_file_set_boolean (keyfile, group, CSV_ALT_ROWS, settings_data->skip_alt_rows);
|
||||
g_key_file_set_boolean (keyfile, group, CSV_FORMAT, settings_data->csv_format);
|
||||
|
||||
|
||||
@@ -68,9 +68,9 @@ GncTxImport::GncTxImport(GncImpFileFormat format)
|
||||
* initialized, only the data that needs to be freed is freed. */
|
||||
date_format = -1;
|
||||
currency_format = 0;
|
||||
start_row = 0;
|
||||
end_row = 1000;
|
||||
skip_rows = FALSE;
|
||||
skip_start_lines = 0;
|
||||
skip_end_lines = 0;
|
||||
skip_alt_lines = FALSE;
|
||||
parse_errors = false;
|
||||
|
||||
file_fmt = format;
|
||||
@@ -423,13 +423,10 @@ void GncTxImport::create_transactions (Account* account,
|
||||
|
||||
/* compute start and end iterators based on user-set restrictions */
|
||||
auto parsed_lines_it = parsed_lines.begin();
|
||||
std::advance(parsed_lines_it, start_row);
|
||||
std::advance(parsed_lines_it, skip_start_lines);
|
||||
|
||||
auto parsed_lines_max = parsed_lines.begin();
|
||||
if (end_row > parsed_lines.size())
|
||||
parsed_lines_max = parsed_lines.end();
|
||||
else
|
||||
std::advance(parsed_lines_max, end_row);
|
||||
std::advance(parsed_lines_max, parsed_lines.size() - skip_end_lines);
|
||||
|
||||
base_account = account;
|
||||
auto odd_line = false;
|
||||
@@ -437,7 +434,7 @@ void GncTxImport::create_transactions (Account* account,
|
||||
|
||||
/* Iterate over all parsed lines */
|
||||
for (parsed_lines_it, odd_line;
|
||||
parsed_lines_it != parsed_lines_max;
|
||||
parsed_lines_it < parsed_lines_max;
|
||||
++parsed_lines_it, odd_line = !odd_line)
|
||||
{
|
||||
auto parsed_line = *parsed_lines_it;
|
||||
@@ -449,7 +446,7 @@ void GncTxImport::create_transactions (Account* account,
|
||||
skip_rows is enabled AND
|
||||
current line is an odd line */
|
||||
if ((redo_errors && std::get<1>(parsed_line).empty()) ||
|
||||
(!redo_errors && skip_rows && odd_line))
|
||||
(!redo_errors && skip_alt_lines && odd_line))
|
||||
continue;
|
||||
|
||||
try
|
||||
|
||||
@@ -113,9 +113,9 @@ public:
|
||||
std::multimap <time64, std::shared_ptr<DraftTransaction>> transactions; /**< map of transaction objects created
|
||||
from parsed_lines and column_types, ordered by date */
|
||||
int date_format; /**< The format of the text in the date columns from date_format_internal. */
|
||||
guint start_row; /**< The start row to generate transactions from. */
|
||||
guint end_row; /**< The end row to generate transactions from. */
|
||||
gboolean skip_rows; /**< Skip Alternate Rows from start row. */
|
||||
guint skip_start_lines; /**< Number of lines to skip at the beginning of the parse data. */
|
||||
guint skip_end_lines; /**< Number of lines to skip at the end of the parse data. */
|
||||
gboolean skip_alt_lines; /**< Skip Alternate Rows from start row. */
|
||||
int currency_format; /**< The currency format, 0 for locale, 1 for comma dec and 2 for period */
|
||||
bool parse_errors; /**< Indicates whether the last parse_to_trans run had any errors */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user