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" 38 #include "guile-mappings.h" 39 #include "gnc-guile-utils.h" 42 #define GNC_PREFS_GROUP "dialogs.import.qif.account-picker" 48 ACCOUNT_COL_PLACEHOLDER,
56 GtkTreeView * treeview;
59 GtkWidget * ok_button;
60 QIFImportWindow * qif_wind;
62 gchar * selected_name;
65 void gnc_ui_qif_account_picker_new_cb (GtkButton * w, gpointer user_data);
77 acct_tree_add_accts(SCM accts,
80 const char *base_name,
81 const char *search_name,
82 GtkTreeRowReference **reference)
92 while (!scm_is_null(accts))
94 gboolean placeholder = FALSE;
95 current = SCM_CAR(accts);
97 if (scm_is_null(current))
99 g_critical(
"QIF import: BUG DETECTED in acct_tree_add_accts!");
100 accts = SCM_CDR(accts);
104 if (scm_is_string(SCM_CAR(current)))
105 compname = gnc_scm_to_utf8_string (SCM_CAR(current));
107 compname = g_strdup(
"");
109 if (!scm_is_null(SCM_CADDR(current)))
119 if (base_name && *base_name)
122 base_name, compname, (
char *)NULL);
126 acctname = g_strdup(compname);
129 checked = (SCM_CADR(current) == SCM_BOOL_T);
135 gtk_tree_store_append(store, &iter, parent);
136 gtk_tree_store_set(store, &iter,
137 ACCOUNT_COL_NAME, compname,
138 ACCOUNT_COL_FULLNAME, acctname,
139 ACCOUNT_COL_PLACEHOLDER, placeholder,
140 ACCOUNT_COL_CHECK, checked,
143 if (reference && !*reference &&
144 search_name && (g_utf8_collate(search_name, acctname) == 0))
146 GtkTreePath *path = gtk_tree_model_get_path(GTK_TREE_MODEL(store), &iter);
147 *reference = gtk_tree_row_reference_new(GTK_TREE_MODEL(store), path);
148 gtk_tree_path_free(path);
153 acct_tree_add_accts(SCM_CADDR(current), store, &iter, acctname,
154 search_name, reference);
160 accts = SCM_CDR(accts);
171 build_acct_tree(QIFAccountPickerDialog * picker, QIFImportWindow *
import)
173 SCM get_accts = scm_c_eval_string(
"qif-import:get-all-accts");
177 GtkTreeSelection* selection;
178 GtkTreeRowReference *reference = NULL;
179 gchar *name_to_select;
181 g_return_if_fail(picker &&
import);
184 acct_tree = scm_call_1(get_accts,
185 gnc_ui_qif_import_assistant_get_mappings(
import));
190 name_to_select = g_strdup(picker->selected_name);
191 store = GTK_TREE_STORE(gtk_tree_view_get_model(picker->treeview));
192 gtk_tree_store_clear(store);
193 acct_tree_add_accts(acct_tree, store, NULL, NULL, name_to_select, &reference);
194 g_free(name_to_select);
199 selection = gtk_tree_view_get_selection(picker->treeview);
200 path = gtk_tree_row_reference_get_path(reference);
203 gtk_tree_view_expand_to_path(picker->treeview, path);
204 gtk_tree_selection_select_path(selection, path);
205 gtk_tree_view_scroll_to_cell (picker->treeview, path,
206 NULL, TRUE, 0.5, 0.0);
207 gtk_tree_path_free(path);
209 gtk_tree_row_reference_free(reference);
221 gnc_ui_qif_account_picker_new_cb(GtkButton * w, gpointer user_data)
223 QIFAccountPickerDialog * wind = user_data;
224 SCM name_setter = scm_c_eval_string(
"qif-map-entry:set-gnc-name!");
228 GtkWidget *dlg, *entry;
231 dlg = gtk_message_dialog_new(GTK_WINDOW(wind->dialog),
232 GTK_DIALOG_DESTROY_WITH_PARENT,
233 GTK_MESSAGE_QUESTION,
234 GTK_BUTTONS_OK_CANCEL,
235 "%s", _(
"Enter a name for the account"));
236 gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_OK);
237 entry = gtk_entry_new();
238 gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
239 gtk_entry_set_max_length(GTK_ENTRY(entry), 250);
240 gtk_widget_show(entry);
241 gtk_container_add(GTK_CONTAINER(gtk_dialog_get_content_area (GTK_DIALOG(dlg))), entry);
244 response = gtk_dialog_run(GTK_DIALOG(dlg));
245 name = gtk_entry_get_text(GTK_ENTRY(entry));
248 if (response == GTK_RESPONSE_OK && name && *name)
251 if (wind->selected_name && *(wind->selected_name))
254 wind->selected_name, name, (
char *)NULL);
256 fullname = g_strdup(name);
259 g_free(wind->selected_name);
260 wind->selected_name = fullname;
261 scm_call_2(name_setter, wind->map_entry, scm_from_utf8_string(fullname));
263 gtk_widget_destroy(dlg);
266 build_acct_tree(wind, wind->qif_wind);
267 gtk_widget_grab_focus(GTK_WIDGET(wind->treeview));
276 gnc_ui_qif_account_picker_changed_cb(GtkTreeSelection *selection,
279 QIFAccountPickerDialog * wind = user_data;
280 SCM name_setter = scm_c_eval_string(
"qif-map-entry:set-gnc-name!");
283 gboolean placeholder;
285 gtk_widget_set_sensitive (wind->ok_button, TRUE);
287 g_free(wind->selected_name);
288 if (gtk_tree_selection_get_selected(selection, &model, &iter))
290 gtk_tree_model_get(model, &iter,
291 ACCOUNT_COL_PLACEHOLDER, &placeholder,
292 ACCOUNT_COL_FULLNAME, &wind->selected_name,
294 scm_call_2(name_setter, wind->map_entry,
295 wind->selected_name ? scm_from_utf8_string(wind->selected_name) : SCM_BOOL_F);
299 gchar *text = g_strdup_printf (_(
"The account %s is a placeholder account and does not allow " 300 "transactions. Please choose a different account."), wind->selected_name);
302 gtk_label_set_text (GTK_LABEL(wind->pwarning), text);
303 gnc_label_set_alignment (wind->pwarning, 0.0, 0.5);
304 gtk_widget_show_all (GTK_WIDGET(wind->pwhbox));
307 gtk_widget_set_sensitive (wind->ok_button, FALSE);
310 gtk_widget_hide (GTK_WIDGET(wind->pwhbox));
314 wind->selected_name = NULL;
324 gnc_ui_qif_account_picker_row_activated_cb(GtkTreeView *view,
326 GtkTreeViewColumn *column,
329 QIFAccountPickerDialog *wind = user_data;
330 g_return_if_fail(wind);
332 gtk_dialog_response(GTK_DIALOG(wind->dialog), GTK_RESPONSE_OK);
341 gnc_ui_qif_account_picker_map_cb(GtkWidget * w, gpointer user_data)
343 QIFAccountPickerDialog * wind = user_data;
348 build_acct_tree(wind, wind->qif_wind);
358 dialog_response_cb (GtkDialog *dialog, gint response_id, gpointer user_data)
360 QIFAccountPickerDialog * wind = user_data;
363 gboolean placeholder = TRUE;
365 if (gtk_tree_selection_get_selected (gtk_tree_view_get_selection
366 (wind->treeview), &model, &iter))
367 gtk_tree_model_get (model, &iter,
368 ACCOUNT_COL_PLACEHOLDER, &placeholder, -1);
370 if (response_id == GTK_RESPONSE_OK)
373 g_signal_stop_emission_by_name (dialog,
"response");
387 qif_account_picker_dialog(GtkWindow *parent, QIFImportWindow * qif_wind, SCM map_entry)
389 QIFAccountPickerDialog * wind;
390 SCM gnc_name = scm_c_eval_string(
"qif-map-entry:gnc-name");
391 SCM set_gnc_name = scm_c_eval_string(
"qif-map-entry:set-gnc-name!");
392 SCM orig_acct = scm_call_1(gnc_name, map_entry);
396 wind = g_new0(QIFAccountPickerDialog, 1);
399 wind->map_entry = map_entry;
400 scm_gc_protect_object(wind->map_entry);
403 if (scm_is_string(orig_acct))
404 wind->selected_name = gnc_scm_to_utf8_string (orig_acct);
406 builder = gtk_builder_new();
407 gnc_builder_add_from_file (builder,
"dialog-account-picker.glade",
"qif_import_account_picker_dialog");
410 gtk_builder_connect_signals (builder, wind);
412 wind->dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"qif_import_account_picker_dialog"));
413 wind->treeview = GTK_TREE_VIEW(gtk_builder_get_object (builder,
"account_tree"));
414 wind->pwhbox = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_warning_hbox"));
415 wind->pwarning = GTK_WIDGET(gtk_builder_get_object (builder,
"placeholder_warning_label"));
416 wind->ok_button = GTK_WIDGET(gtk_builder_get_object (builder,
"okbutton"));
417 wind->qif_wind = qif_wind;
419 gtk_window_set_transient_for (GTK_WINDOW (wind->dialog), parent);
422 GtkTreeSelection *selection;
424 GtkCellRenderer *renderer;
425 GtkTreeViewColumn *column;
427 store = gtk_tree_store_new(NUM_ACCOUNT_COLS, G_TYPE_STRING, G_TYPE_STRING,
428 G_TYPE_BOOLEAN, G_TYPE_BOOLEAN);
429 gtk_tree_view_set_model(wind->treeview, GTK_TREE_MODEL(store));
430 g_object_unref(store);
432 renderer = gtk_cell_renderer_text_new();
433 column = gtk_tree_view_column_new_with_attributes(_(
"Account"),
438 g_object_set(column,
"expand", TRUE, NULL);
439 gtk_tree_view_append_column(wind->treeview, column);
441 renderer = gtk_cell_renderer_toggle_new();
442 g_object_set(renderer,
"activatable", FALSE, NULL);
443 column = gtk_tree_view_column_new_with_attributes(_(
"Placeholder?"),
446 ACCOUNT_COL_PLACEHOLDER,
448 gtk_tree_view_append_column(wind->treeview, column);
450 renderer = gtk_cell_renderer_toggle_new();
451 g_object_set(renderer,
"activatable", FALSE, NULL);
452 column = gtk_tree_view_column_new_with_attributes(_(
"New?"),
457 gtk_tree_view_append_column(wind->treeview, column);
459 selection = gtk_tree_view_get_selection(wind->treeview);
460 g_signal_connect(selection,
"changed",
461 G_CALLBACK(gnc_ui_qif_account_picker_changed_cb), wind);
462 g_signal_connect(wind->treeview,
"row-activated",
463 G_CALLBACK(gnc_ui_qif_account_picker_row_activated_cb),
467 g_signal_connect_after(wind->dialog,
"map",
468 G_CALLBACK(gnc_ui_qif_account_picker_map_cb),
471 gnc_restore_window_size (GNC_PREFS_GROUP,
472 GTK_WINDOW(wind->dialog), parent);
476 build_acct_tree(wind, wind->qif_wind);
478 g_signal_connect (wind->dialog,
"response",
479 G_CALLBACK (dialog_response_cb), wind);
483 response = gtk_dialog_run(GTK_DIALOG(wind->dialog));
485 while (response == GNC_RESPONSE_NEW);
486 gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(wind->dialog));
487 gtk_widget_destroy(wind->dialog);
488 g_object_unref(G_OBJECT(builder));
490 scm_gc_unprotect_object(wind->map_entry);
491 g_free(wind->selected_name);
494 if (response == GTK_RESPONSE_OK)
498 scm_call_2(set_gnc_name, map_entry, orig_acct);
utility functions for the GnuCash UI
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
The gnc_account_lookup_full_name() subroutine works like gnc_account_lookup_by_name, but uses fully-qualified names using the given separator.
Generic api to store and retrieve preferences.
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
const gchar * gnc_get_account_separator_string(void)
Returns the account separation character chosen by the user.