26 #include <glib/gi18n.h> 28 #include "dialog-find-account.h" 30 #include "dialog-utils.h" 31 #include "gnc-component-manager.h" 32 #include "gnc-session.h" 39 #define DIALOG_FIND_ACCOUNT_CM_CLASS "dialog-find-account" 40 #define GNC_PREFS_GROUP "dialogs.find-account" 43 enum GncFindAccountColumn {ACC_FULL_NAME, ACCOUNT, PLACE_HOLDER, HIDDEN, NOT_USED, BAL_ZERO, TAX};
53 GtkWidget *radio_frame;
54 GtkWidget *radio_root;
55 GtkWidget *radio_subroot;
57 GtkWidget *filter_button;
58 GtkWidget *filter_text_entry;
62 gchar *saved_filter_text;
63 gint event_handler_id;
68 static QofLogModule log_module = GNC_MOD_GUI;
70 static void close_handler (gpointer user_data);
73 gnc_find_account_dialog_window_delete_event_cb (GtkWidget *widget,
79 gnc_save_window_size (GNC_PREFS_GROUP,
80 GTK_WINDOW(facc_dialog->window));
85 gnc_find_account_dialog_window_destroy_cb (GtkWidget *
object, gpointer user_data)
90 gnc_unregister_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
92 if (facc_dialog->event_handler_id)
95 facc_dialog->event_handler_id = 0;
98 if (facc_dialog->saved_filter_text)
99 g_free (facc_dialog->saved_filter_text);
101 if (facc_dialog->window)
103 gtk_widget_destroy (facc_dialog->window);
104 facc_dialog->window = NULL;
106 g_free (facc_dialog);
111 gnc_find_account_dialog_window_key_press_cb (GtkWidget *widget,
117 if (event->keyval == GDK_KEY_Escape)
119 close_handler (facc_dialog);
129 if (jump_account != NULL)
132 if (facc_dialog->jump_close == TRUE)
133 gnc_close_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
139 if (facc_dialog->jump_close == TRUE)
140 facc_dialog->jump_close = FALSE;
142 facc_dialog->jump_close = TRUE;
151 GtkTreeSelection *selection;
153 model = gtk_tree_view_get_model (GTK_TREE_VIEW(facc_dialog->view));
154 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(facc_dialog->view));
156 if (gtk_tree_selection_get_selected (selection, &model, &iter))
157 gtk_tree_model_get (model, &iter, ACCOUNT, &jump_account, -1);
159 jump_to_account (facc_dialog, jump_account);
163 row_double_clicked (GtkTreeView *treeview, GtkTreePath *path,
170 model = gtk_tree_view_get_model (treeview);
172 if (gtk_tree_model_get_iter (model, &iter, path))
173 gtk_tree_model_get (model, &iter, ACCOUNT, &jump_account, -1);
175 jump_to_account (facc_dialog, jump_account);
179 gnc_find_account_dialog_jump_button_cb (GtkWidget * widget, gpointer user_data)
182 gnc_find_account_dialog_jump_to (facc_dialog);
186 gnc_find_account_dialog_check_button_cb (GtkWidget * widget, gpointer user_data)
189 gnc_find_account_dialog_jump_set (facc_dialog);
193 gnc_find_account_dialog_close_button_cb (GtkWidget * widget, gpointer user_data)
196 gnc_close_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
200 fill_model (GtkTreeModel *model,
Account *account)
204 gboolean acc_empty = gnc_account_and_descendants_empty (account);
205 gnc_numeric total = xaccAccountGetBalanceInCurrency (account, NULL, TRUE);
207 PINFO(
"Add to Store: Account '%s'", fullname);
209 gtk_list_store_append (GTK_LIST_STORE(model), &iter);
211 gtk_list_store_set (GTK_LIST_STORE(model), &iter,
212 ACC_FULL_NAME, fullname, ACCOUNT, account,
215 NOT_USED, (acc_empty ?
"emblem-default" : NULL),
232 radio_root = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(facc_dialog->radio_root));
235 if ((facc_dialog->account == NULL) || (radio_root == TRUE))
236 root = gnc_book_get_root_account (gnc_get_current_book());
238 root = facc_dialog->account;
242 if (use_saved_filter)
243 filter_text = g_ascii_strdown (facc_dialog->saved_filter_text, -1);
245 filter_text = g_ascii_strdown (gtk_entry_get_text (GTK_ENTRY(facc_dialog->filter_text_entry)), -1);
248 model = gtk_tree_view_get_model (GTK_TREE_VIEW(facc_dialog->view));
249 g_object_ref (G_OBJECT(model));
250 gtk_tree_view_set_model (GTK_TREE_VIEW(facc_dialog->view), NULL);
253 gtk_list_store_clear (GTK_LIST_STORE(model));
256 for (ptr = accts; ptr; ptr = g_list_next (ptr))
260 gchar *match_string = g_ascii_strdown (full_name, -1);
262 if ((g_strcmp0 (filter_text,
"") == 0) || (g_strrstr (match_string, filter_text) != NULL))
263 fill_model (model, acc);
265 g_free (match_string);
268 g_free (filter_text);
272 gtk_tree_view_set_model (GTK_TREE_VIEW(facc_dialog->view), model);
273 g_object_unref(G_OBJECT(model));
275 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(facc_dialog->view));
281 get_account_info (facc_dialog, FALSE);
287 get_account_info (facc_dialog, FALSE);
289 if (facc_dialog->saved_filter_text)
290 g_free (facc_dialog->saved_filter_text);
293 facc_dialog->saved_filter_text = g_strdup (gtk_entry_get_text
294 (GTK_ENTRY(facc_dialog->filter_text_entry)));
297 gtk_entry_set_text (GTK_ENTRY(facc_dialog->filter_text_entry),
"");
303 get_account_info (facc_dialog, FALSE);
305 if (facc_dialog->saved_filter_text)
306 g_free (facc_dialog->saved_filter_text);
309 facc_dialog->saved_filter_text = g_strdup (gtk_entry_get_text
310 (GTK_ENTRY(facc_dialog->filter_text_entry)));
312 gtk_editable_select_region (GTK_EDITABLE(facc_dialog->filter_text_entry), 0, -1);
316 gnc_find_account_event_handler (
QofInstance *entity,
323 g_return_if_fail (facc_dialog);
325 if (!GNC_IS_ACCOUNT(entity))
328 ENTER(
"entity %p of type %d, dialog %p, event_data %p",
329 entity, event_type, facc_dialog, evt_data);
331 account = GNC_ACCOUNT(entity);
336 case QOF_EVENT_REMOVE:
337 case QOF_EVENT_MODIFY:
339 get_account_info (facc_dialog, TRUE);
344 LEAVE(
"unknown event type");
352 gnc_find_account_dialog_create (GtkWidget *parent,
FindAccountDialog *facc_dialog)
356 GtkTreeSelection *selection;
358 GtkTreeViewColumn *tree_column;
363 builder = gtk_builder_new();
364 gnc_builder_add_from_file (builder,
"dialog-find-account.glade",
"list-store");
365 gnc_builder_add_from_file (builder,
"dialog-find-account.glade",
"find_account_window");
367 window = GTK_WIDGET(gtk_builder_get_object (builder,
"find_account_window"));
368 facc_dialog->window = window;
371 gtk_widget_set_name (GTK_WIDGET(window),
"gnc-id-find-account");
372 gnc_widget_style_context_add_class (GTK_WIDGET(window),
"gnc-class-account");
374 facc_dialog->session = gnc_get_current_session();
375 facc_dialog->parent = parent;
376 facc_dialog->saved_filter_text = g_strdup (
"");
378 gtk_window_set_title (GTK_WINDOW(facc_dialog->window), _(
"Find Account"));
381 facc_dialog->radio_root = GTK_WIDGET(gtk_builder_get_object (builder,
"radio-root"));
382 facc_dialog->radio_subroot = GTK_WIDGET(gtk_builder_get_object (builder,
"radio-subroot"));
384 g_signal_connect (facc_dialog->radio_root,
"toggled",
385 G_CALLBACK(list_type_selected_cb), (gpointer)facc_dialog);
387 facc_dialog->filter_text_entry = GTK_WIDGET(gtk_builder_get_object (builder,
"filter-text-entry"));
388 facc_dialog->sub_label = GTK_WIDGET(gtk_builder_get_object (builder,
"sub-label"));
389 facc_dialog->radio_frame = GTK_WIDGET(gtk_builder_get_object (builder,
"frame-radio"));
390 facc_dialog->filter_button = GTK_WIDGET(gtk_builder_get_object (builder,
"filter-button"));
391 g_signal_connect (facc_dialog->filter_button,
"clicked",
392 G_CALLBACK(filter_button_cb), (gpointer)facc_dialog);
393 g_signal_connect (facc_dialog->filter_text_entry,
"activate",
394 G_CALLBACK(filter_active_cb), (gpointer)facc_dialog);
396 button = GTK_WIDGET(gtk_builder_get_object (builder,
"jumpto_button"));
397 g_signal_connect(button,
"clicked", G_CALLBACK(gnc_find_account_dialog_jump_button_cb), facc_dialog);
398 button = GTK_WIDGET(gtk_builder_get_object (builder,
"check_button"));
399 g_signal_connect(button,
"clicked", G_CALLBACK(gnc_find_account_dialog_check_button_cb), facc_dialog);
400 button = GTK_WIDGET(gtk_builder_get_object (builder,
"close_button"));
401 g_signal_connect(button,
"clicked", G_CALLBACK(gnc_find_account_dialog_close_button_cb), facc_dialog);
403 facc_dialog->view = GTK_WIDGET(gtk_builder_get_object (builder,
"treeview"));
404 g_signal_connect (facc_dialog->view,
"row-activated",
405 G_CALLBACK(row_double_clicked), (gpointer)facc_dialog);
408 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW(facc_dialog->view), gnc_tree_view_get_grid_lines_pref ());
410 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(facc_dialog->view));
411 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
414 tree_column = gtk_tree_view_column_new();
415 gtk_tree_view_column_set_title (tree_column, _(
"Place Holder"));
416 gtk_tree_view_append_column (GTK_TREE_VIEW(facc_dialog->view), tree_column);
417 gtk_tree_view_column_set_alignment (tree_column, 0.5);
418 gtk_tree_view_column_set_expand (tree_column, TRUE);
419 cr = gtk_cell_renderer_pixbuf_new();
420 gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
422 gtk_tree_view_column_set_attributes (tree_column, cr,
"icon-name", PLACE_HOLDER, NULL);
423 gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
425 tree_column = gtk_tree_view_column_new();
426 gtk_tree_view_column_set_title (tree_column, _(
"Hidden"));
427 gtk_tree_view_append_column (GTK_TREE_VIEW(facc_dialog->view), tree_column);
428 gtk_tree_view_column_set_alignment (tree_column, 0.5);
429 gtk_tree_view_column_set_expand (tree_column, TRUE);
430 cr = gtk_cell_renderer_pixbuf_new();
431 gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
433 gtk_tree_view_column_set_attributes (tree_column, cr,
"icon-name", HIDDEN, NULL);
434 gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
436 tree_column = gtk_tree_view_column_new();
437 gtk_tree_view_column_set_title (tree_column, _(
"Not Used"));
438 gtk_tree_view_append_column (GTK_TREE_VIEW(facc_dialog->view), tree_column);
439 gtk_tree_view_column_set_alignment (tree_column, 0.5);
440 gtk_tree_view_column_set_expand (tree_column, TRUE);
441 cr = gtk_cell_renderer_pixbuf_new();
442 gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
444 gtk_tree_view_column_set_attributes (tree_column, cr,
"icon-name", NOT_USED, NULL);
445 gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
447 tree_column = gtk_tree_view_column_new();
448 gtk_tree_view_column_set_title (tree_column, _(
"Balance Zero"));
449 gtk_tree_view_append_column (GTK_TREE_VIEW(facc_dialog->view), tree_column);
450 gtk_tree_view_column_set_alignment (tree_column, 0.5);
451 gtk_tree_view_column_set_expand (tree_column, TRUE);
452 cr = gtk_cell_renderer_pixbuf_new();
453 gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
455 gtk_tree_view_column_set_attributes (tree_column, cr,
"icon-name", BAL_ZERO, NULL);
456 gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
458 tree_column = gtk_tree_view_column_new();
459 gtk_tree_view_column_set_title (tree_column, _(
"Tax related"));
460 gtk_tree_view_append_column (GTK_TREE_VIEW(facc_dialog->view), tree_column);
461 gtk_tree_view_column_set_alignment (tree_column, 0.5);
462 gtk_tree_view_column_set_expand (tree_column, TRUE);
463 cr = gtk_cell_renderer_pixbuf_new();
464 gtk_tree_view_column_pack_start (tree_column, cr, TRUE);
466 gtk_tree_view_column_set_attributes (tree_column, cr,
"icon-name", TAX, NULL);
467 gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
469 g_signal_connect (facc_dialog->window,
"destroy",
470 G_CALLBACK(gnc_find_account_dialog_window_destroy_cb), facc_dialog);
472 g_signal_connect (facc_dialog->window,
"delete-event",
473 G_CALLBACK(gnc_find_account_dialog_window_delete_event_cb), facc_dialog);
475 g_signal_connect (facc_dialog->window,
"key_press_event",
476 G_CALLBACK(gnc_find_account_dialog_window_key_press_cb), facc_dialog);
478 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, facc_dialog);
480 g_object_unref (G_OBJECT(builder));
482 gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->window), GTK_WINDOW(parent));
484 gtk_widget_show_all (GTK_WIDGET(facc_dialog->window));
486 if (facc_dialog->account != NULL)
491 gchar *sub_label = g_strdup_printf (_(
"Su_b-accounts of '%s'"),
494 gtk_button_set_label (GTK_BUTTON(facc_dialog->radio_subroot), sub_label);
496 g_free (sub_full_name);
499 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(facc_dialog->radio_subroot), TRUE);
502 gtk_widget_hide (facc_dialog->radio_frame);
505 gtk_entry_set_text (GTK_ENTRY(facc_dialog->filter_text_entry),
"");
511 get_account_info (facc_dialog, FALSE);
516 close_handler (gpointer user_data)
521 gnc_save_window_size (GNC_PREFS_GROUP,
522 GTK_WINDOW(facc_dialog->window));
523 gtk_widget_destroy (GTK_WIDGET(facc_dialog->window));
528 refresh_handler (GHashTable *changes, gpointer user_data)
535 show_handler (
const char *klass, gint component_id,
536 gpointer user_data, gpointer iter_data)
543 LEAVE(
"No data structure");
546 gtk_window_present (GTK_WINDOW(facc_dialog->window));
559 gnc_find_account_dialog (GtkWidget *parent,
Account *account)
565 if (gnc_forall_gui_components (DIALOG_FIND_ACCOUNT_CM_CLASS, show_handler, NULL))
567 LEAVE(
"Existing dialog raised");
572 facc_dialog->account = account;
573 facc_dialog->jump_close = TRUE;
575 gnc_find_account_dialog_create (parent, facc_dialog);
577 component_id = gnc_register_gui_component (DIALOG_FIND_ACCOUNT_CM_CLASS,
578 refresh_handler, close_handler,
581 gnc_gui_component_set_session (component_id, facc_dialog->session);
GList * gnc_account_get_descendants_sorted(const Account *account)
This function returns a GList containing all the descendants of the specified account, sorted at each level.
void gnc_plugin_page_account_tree_open(Account *account, GtkWindow *win)
Given a pointer to an account, the account tree will open and the account will be selected (if any)...
This file contains the functions to present a gui to the user for creating a new account or editing a...
void(* QofEventHandler)(QofInstance *ent, QofEventId event_type, gpointer handler_data, gpointer event_data)
Handler invoked when an event is generated.
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
#define DEBUG(format, args...)
Print a debugging message.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
#define ENTER(format, args...)
Print a function entry debugging message.
gint qof_event_register_handler(QofEventHandler handler, gpointer user_data)
Register a handler for events.
gchar * gnc_account_get_full_name(const Account *account)
The gnc_account_get_full_name routine returns the fully qualified name of the account using the given...
Account handling public routines.
gint QofEventId
Define the type of events allowed.
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
gboolean xaccAccountGetTaxRelated(const Account *acc)
DOCUMENT ME!
gboolean xaccAccountGetHidden(const Account *acc)
Get the "hidden" flag for an account.
Functions providing a chart of account page.
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
#define LEAVE(format, args...)
Print a function exit debugging message.
const char * xaccAccountGetName(const Account *acc)
Get the account's name.