29 #include <glib/gi18n.h>
32 #include "gnc-account-sel.h"
37 #include "gnc-session.h"
39 #define ACCT_DATA_TAG "gnc-account-sel_acct"
55 static guint account_sel_signals [LAST_SIGNAL] = { 0 };
59 static void gnc_account_sel_finalize (GObject *
object);
60 static void gnc_account_sel_dispose (GObject *
object);
62 static void gas_filter_accounts (gpointer data, gpointer user_data);
66 static void gas_new_account_click (GtkButton *b, gpointer ud);
68 static GtkHBox *parent_class;
71 gnc_account_sel_get_type (
void)
73 static GType account_sel_type = 0;
75 if (account_sel_type == 0)
77 GTypeInfo account_sel_info =
82 (GClassInitFunc) gnc_account_sel_class_init,
87 (GInstanceInitFunc) gnc_account_sel_init
90 account_sel_type = g_type_register_static (GTK_TYPE_HBOX,
92 &account_sel_info, 0);
95 return account_sel_type;
103 gpointer event_data )
105 if ( ! ( event_type == QOF_EVENT_CREATE
106 || event_type == QOF_EVENT_MODIFY
107 || event_type == QOF_EVENT_DESTROY )
108 || !GNC_IS_ACCOUNT(entity) )
119 GObjectClass *object_class = G_OBJECT_CLASS (klass);
121 parent_class = g_type_class_peek_parent (klass);
123 object_class->finalize = gnc_account_sel_finalize;
124 object_class->dispose = gnc_account_sel_dispose;
126 account_sel_signals [ACCOUNT_SEL_CHANGED] =
127 g_signal_new (
"account_sel_changed",
128 G_OBJECT_CLASS_TYPE (object_class),
133 g_cclosure_marshal_VOID__VOID,
141 g_signal_emit_by_name(gas,
"account_sel_changed");
149 gas->initDone = FALSE;
150 gas->acctTypeFilters = FALSE;
151 gas->newAccountButton = NULL;
153 g_object_set(gas,
"spacing", 2, (gchar*)NULL);
155 gas->store = gtk_list_store_new(NUM_ACCT_COLS, G_TYPE_STRING, G_TYPE_POINTER);
156 widget = gtk_combo_box_new_with_model_and_entry(GTK_TREE_MODEL(gas->store));
157 gas->combo = GTK_COMBO_BOX(widget);
158 gtk_combo_box_set_entry_text_column(GTK_COMBO_BOX(widget), ACCT_COL_NAME);
159 g_object_unref(gas->store);
160 g_signal_connect_swapped(gas->combo,
"changed",
161 G_CALLBACK(combo_changed_cb), gas);
162 gtk_container_add( GTK_CONTAINER(gas), widget );
165 gnc_cbwe_require_list_item(GTK_COMBO_BOX(widget));
168 gas_populate_list( gas );
170 gas->eventHandlerId =
173 gas->initDone = TRUE;
192 GList *accts, *ptr, *filteredAccts;
193 gchar *currentSel, *name;
195 entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gas->combo)));
196 currentSel = gtk_editable_get_chars(
197 GTK_EDITABLE(entry), 0, -1 );
199 g_signal_handlers_block_by_func( gas->combo, combo_changed_cb , gas );
201 root = gnc_book_get_root_account( gnc_get_current_book() );
204 filteredAccts = NULL;
206 atnd.outList = &filteredAccts;
208 g_list_foreach( accts, gas_filter_accounts, (gpointer)&atnd );
209 g_list_free( accts );
211 gtk_list_store_clear(gas->store);
212 for (ptr = filteredAccts, i = 0; ptr; ptr = g_list_next(ptr), i++)
216 gtk_list_store_append(gas->store, &iter);
217 gtk_list_store_set(gas->store, &iter,
221 if (g_utf8_collate(name, currentSel) == 0)
231 gtk_combo_box_set_active(GTK_COMBO_BOX(gas->combo), active);
233 g_signal_handlers_unblock_by_func( gas->combo, combo_changed_cb , gas );
235 g_list_free( filteredAccts );
238 g_free( currentSel );
244 gas_filter_accounts( gpointer data, gpointer user_data )
252 if ( atnd->gas->acctTypeFilters )
257 if ( g_list_find( atnd->gas->acctTypeFilters,
265 if ( atnd->gas->acctCommodityFilters )
267 if ( g_list_find_custom( atnd->gas->acctCommodityFilters,
277 *atnd->outList = g_list_append( *atnd->outList, a );
282 gnc_account_sel_new (
void)
286 gas = g_object_new (GNC_TYPE_ACCOUNT_SEL, NULL);
288 return GTK_WIDGET (gas);
299 gnc_account_sel_find_account (GtkTreeModel *model,
306 gtk_tree_model_get(model, iter, ACCT_COL_PTR, &model_acc, -1);
307 if (data->acct != model_acc)
310 gtk_combo_box_set_active_iter(GTK_COMBO_BOX(data->gas->combo), iter);
318 if (set_default_acct)
320 gtk_combo_box_set_active(GTK_COMBO_BOX(gas->combo), 0);
326 gtk_combo_box_set_active( GTK_COMBO_BOX(gas->combo), -1 );
329 GtkEntry *entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(gas->combo)));
330 gtk_editable_delete_text(GTK_EDITABLE(entry), 0, -1);
336 gtk_tree_model_foreach(GTK_TREE_MODEL(gas->store),
337 (GtkTreeModelForeachFunc)gnc_account_sel_find_account,
347 if (!gtk_combo_box_get_active_iter(GTK_COMBO_BOX(gas->combo), &iter))
350 gtk_tree_model_get(GTK_TREE_MODEL(gas->store), &iter,
358 gnc_account_sel_set_acct_filters(
GNCAccountSel *gas, GList *typeFilters, GList *commodityFilters )
361 if ( gas->acctTypeFilters != NULL )
363 g_list_free( gas->acctTypeFilters );
364 gas->acctTypeFilters = NULL;
367 if ( gas->acctCommodityFilters != NULL)
369 g_list_free( gas->acctCommodityFilters );
370 gas->acctCommodityFilters = NULL;
374 if (( ! typeFilters ) && ( ! commodityFilters))
383 gas->acctTypeFilters = g_list_copy( typeFilters );
387 if (commodityFilters)
389 gas->acctCommodityFilters = g_list_copy(commodityFilters);
392 gas_populate_list( gas );
396 gnc_account_sel_finalize (GObject *
object)
400 g_return_if_fail (
object != NULL);
401 g_return_if_fail (GNC_IS_ACCOUNT_SEL (
object));
403 gas = GNC_ACCOUNT_SEL (
object);
405 if (gas->acctTypeFilters)
407 g_list_free (gas->acctTypeFilters);
410 G_OBJECT_CLASS (parent_class)->finalize (
object);
414 gnc_account_sel_dispose (GObject *
object)
418 g_return_if_fail (
object != NULL);
419 g_return_if_fail (GNC_IS_ACCOUNT_SEL (
object));
421 gas = GNC_ACCOUNT_SEL (
object);
423 if (gas->eventHandlerId)
426 gas->eventHandlerId = 0;
429 G_OBJECT_CLASS (parent_class)->dispose (
object);
436 g_return_if_fail (gas != NULL);
438 if ( state == (gas->newAccountButton != NULL) )
444 if ( gas->newAccountButton )
446 g_assert( state == TRUE );
448 gtk_container_remove( GTK_CONTAINER(gas),
449 gas->newAccountButton );
450 gtk_widget_destroy( gas->newAccountButton );
451 gas->newAccountButton = NULL;
456 gas->newAccountButton = gtk_button_new_with_label( _(
"New...") );
457 g_signal_connect( gas->newAccountButton,
459 G_CALLBACK( gas_new_account_click ),
461 gtk_box_pack_start( GTK_BOX(gas), gas->newAccountButton,
469 g_return_if_fail (gas != NULL);
470 gas->isModal = state;
474 gas_new_account_click( GtkButton *b, gpointer ud )
479 gas->acctTypeFilters );
489 return gtk_tree_model_iter_n_children( GTK_TREE_MODEL(gas->store), NULL );
497 GtkTreeModel *model = GTK_TREE_MODEL(gas->store);
502 if (!gtk_tree_model_get_iter_first(model, &iter))
509 gtk_tree_model_get(model, &iter, ACCT_COL_PTR, &acc, -1);
512 gtk_list_store_remove(gas->store, &iter);
516 while (gtk_tree_model_iter_next(model, &iter));
522 gtk_tree_model_get(model, &iter, ACCT_COL_PTR, &acc, -1);
531 more = gtk_list_store_remove(gas->store, &iter);
533 more = gtk_tree_model_iter_next(model, &iter);
538 gtk_combo_box_set_active(GTK_COMBO_BOX(gas->combo), 0);
Account * gnc_account_get_parent(const Account *acc)
GList * gnc_account_get_descendants_sorted(const Account *account)
Dialog for create/edit an account.
utility functions for the GnuCash UI
GNCAccountType xaccAccountGetType(const Account *acc)
int gnc_commodity_compare_void(const void *a, const void *b)
Account * gnc_ui_new_accounts_from_name_window_with_types(const char *name, GList *valid_types)
gint qof_event_register_handler(QofEventHandler handler, gpointer handler_data)
Register a handler for events.
gchar * gnc_account_get_full_name(const Account *account)
void qof_event_unregister_handler(gint handler_id)
Unregister an event handler.
void gnc_ui_new_account_with_types(QofBook *book, GList *valid_types)
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Commodity handling public routines.