28 #include <glib/gi18n.h>
32 #include "dialog-account-picker.h"
33 #include "dialog-utils.h"
34 #include "assistant-qif-import.h"
35 #include "gnc-gui-query.h"
37 #include "guile-mappings.h"
38 #include "gnc-guile-utils.h"
52 GtkTreeView * treeview;
55 gchar * selected_name;
58 void gnc_ui_qif_account_picker_new_cb (GtkButton * w, gpointer user_data);
70 acct_tree_add_accts(SCM accts,
73 const char *base_name,
74 const char *search_name,
75 GtkTreeRowReference **reference)
84 while (!scm_is_null(accts))
86 current = SCM_CAR(accts);
88 if (scm_is_null(current))
90 g_critical(
"QIF import: BUG DETECTED in acct_tree_add_accts!");
91 accts = SCM_CDR(accts);
95 if (scm_is_string(SCM_CAR(current)))
96 compname = gnc_scm_to_utf8_string (SCM_CAR(current));
98 compname = g_strdup(
"");
100 if (!scm_is_null(SCM_CADDR(current)))
110 if (base_name && *base_name)
113 base_name, compname, (
char *)NULL);
117 acctname = g_strdup(compname);
120 checked = (SCM_CADR(current) == SCM_BOOL_T);
122 gtk_tree_store_append(store, &iter, parent);
123 gtk_tree_store_set(store, &iter,
124 ACCOUNT_COL_NAME, compname,
125 ACCOUNT_COL_FULLNAME, acctname,
126 ACCOUNT_COL_CHECK, checked,
129 if (reference && !*reference &&
130 search_name && (g_utf8_collate(search_name, acctname) == 0))
132 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
133 *reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
134 gtk_tree_path_free(path);
139 acct_tree_add_accts(SCM_CADDR(current), store, &iter, acctname,
140 search_name, reference);
146 accts = SCM_CDR(accts);
159 SCM get_accts = scm_c_eval_string(
"qif-import:get-all-accts");
163 GtkTreeSelection* selection;
164 GtkTreeRowReference *reference = NULL;
165 gchar *name_to_select;
167 g_return_if_fail(picker &&
import);
170 acct_tree = scm_call_1(get_accts,
171 gnc_ui_qif_import_assistant_get_mappings(
import));
176 name_to_select = g_strdup(picker->selected_name);
177 store = GTK_TREE_STORE(gtk_tree_view_get_model(picker->treeview));
178 gtk_tree_store_clear(store);
179 acct_tree_add_accts(acct_tree, store, NULL, NULL, name_to_select, &reference);
180 g_free(name_to_select);
185 selection = gtk_tree_view_get_selection(picker->treeview);
186 path = gtk_tree_row_reference_get_path(reference);
189 gtk_tree_view_expand_to_path(picker->treeview, path);
190 gtk_tree_selection_select_path(selection, path);
191 gtk_tree_path_free(path);
193 gtk_tree_row_reference_free(reference);
205 gnc_ui_qif_account_picker_new_cb(GtkButton * w, gpointer user_data)
208 SCM name_setter = scm_c_eval_string(
"qif-map-entry:set-gnc-name!");
212 GtkWidget *dlg, *entry;
215 dlg = gtk_message_dialog_new(GTK_WINDOW(wind->dialog),
216 GTK_DIALOG_DESTROY_WITH_PARENT,
217 GTK_MESSAGE_QUESTION,
218 GTK_BUTTONS_OK_CANCEL,
219 "%s", _(
"Enter a name for the account"));
220 gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_OK);
221 entry = gtk_entry_new();
222 gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
223 gtk_entry_set_max_length(GTK_ENTRY(entry), 250);
224 gtk_widget_show(entry);
225 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dlg)->vbox), entry);
228 response = gtk_dialog_run(GTK_DIALOG(dlg));
229 name = gtk_entry_get_text(GTK_ENTRY(entry));
232 if (response == GTK_RESPONSE_OK && name && *name)
235 if (wind->selected_name && *(wind->selected_name))
238 wind->selected_name, name, (
char *)NULL);
240 fullname = g_strdup(name);
243 g_free(wind->selected_name);
244 wind->selected_name = fullname;
245 scm_call_2(name_setter, wind->map_entry, scm_from_utf8_string(fullname));
247 gtk_widget_destroy(dlg);
250 build_acct_tree(wind, wind->qif_wind);
251 gtk_widget_grab_focus(GTK_WIDGET(wind->treeview));
260 gnc_ui_qif_account_picker_changed_cb(GtkTreeSelection *selection,
264 SCM name_setter = scm_c_eval_string(
"qif-map-entry:set-gnc-name!");
268 g_free(wind->selected_name);
269 if (gtk_tree_selection_get_selected(selection, &model, &iter))
271 gtk_tree_model_get(model, &iter,
272 ACCOUNT_COL_FULLNAME, &wind->selected_name,
274 scm_call_2(name_setter, wind->map_entry,
275 wind->selected_name ? scm_from_utf8_string(wind->selected_name) : SCM_BOOL_F);
279 wind->selected_name = NULL;
289 gnc_ui_qif_account_picker_row_activated_cb(GtkTreeView *view,
291 GtkTreeViewColumn *column,
295 g_return_if_fail(wind);
297 gtk_dialog_response(GTK_DIALOG(wind->dialog), GTK_RESPONSE_OK);
306 gnc_ui_qif_account_picker_map_cb(GtkWidget * w, gpointer user_data)
313 build_acct_tree(wind, wind->qif_wind);
330 SCM gnc_name = scm_c_eval_string(
"qif-map-entry:gnc-name");
331 SCM set_gnc_name = scm_c_eval_string(
"qif-map-entry:set-gnc-name!");
332 SCM orig_acct = scm_call_1(gnc_name, map_entry);
340 wind->map_entry = map_entry;
341 scm_gc_protect_object(wind->map_entry);
344 if (scm_is_string(orig_acct))
345 wind->selected_name = gnc_scm_to_utf8_string (orig_acct);
347 builder = gtk_builder_new();
348 gnc_builder_add_from_file (builder,
"dialog-account-picker.glade",
"QIF Import Account Picker");
351 gtk_builder_connect_signals (builder, wind);
353 wind->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"QIF Import Account Picker"));
354 wind->treeview = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"account_tree"));
355 wind->qif_wind = qif_wind;
359 GtkCellRenderer *renderer;
360 GtkTreeViewColumn *column;
361 GtkTreeSelection *selection;
363 store = gtk_tree_store_new(NUM_ACCOUNT_COLS, G_TYPE_STRING, G_TYPE_STRING,
365 gtk_tree_view_set_model(wind->treeview, GTK_TREE_MODEL(store));
366 g_object_unref(store);
368 renderer = gtk_cell_renderer_text_new();
369 column = gtk_tree_view_column_new_with_attributes(_(
"Account"),
374 g_object_set(column,
"expand", TRUE, NULL);
375 gtk_tree_view_append_column(wind->treeview, column);
377 renderer = gtk_cell_renderer_toggle_new();
378 g_object_set(renderer,
"activatable", FALSE, NULL);
379 column = gtk_tree_view_column_new_with_attributes(_(
"New?"),
384 gtk_tree_view_append_column(wind->treeview, column);
386 selection = gtk_tree_view_get_selection(wind->treeview);
387 g_signal_connect(selection,
"changed",
388 G_CALLBACK(gnc_ui_qif_account_picker_changed_cb), wind);
389 g_signal_connect(wind->treeview,
"row-activated",
390 G_CALLBACK(gnc_ui_qif_account_picker_row_activated_cb),
394 g_signal_connect_after(wind->dialog,
"map",
395 G_CALLBACK(gnc_ui_qif_account_picker_map_cb),
398 button = GTK_WIDGET(gtk_builder_get_object (builder,
"newbutton"));
399 gtk_button_set_use_stock(GTK_BUTTON(button), TRUE);
403 build_acct_tree(wind, wind->qif_wind);
407 response = gtk_dialog_run(GTK_DIALOG(wind->dialog));
409 while (response == GNC_RESPONSE_NEW);
410 gtk_widget_destroy(wind->dialog);
411 g_object_unref(G_OBJECT(builder));
413 scm_gc_unprotect_object(wind->map_entry);
414 g_free(wind->selected_name);
417 if (response == GTK_RESPONSE_OK)
421 scm_call_2(set_gnc_name, map_entry, orig_acct);
utility functions for the GnuCash UI
const gchar * gnc_get_account_separator_string(void)