diff --git a/src/business/business-gnome/business-gnome-utils.c b/src/business/business-gnome/business-gnome-utils.c index ab6db40448..a5c484fde8 100644 --- a/src/business/business-gnome/business-gnome-utils.c +++ b/src/business/business-gnome/business-gnome-utils.c @@ -370,295 +370,12 @@ gnc_fill_account_select_combo (GtkWidget *combo, QofBook *book, g_free (text); } -/*********************************************************************/ -/* Option Menu creation */ - -typedef const char * (*GenericLookup_t)(gpointer); - -typedef struct -{ - gint component_id; - GtkWidget *omenu; - QofBook *book; - gboolean none_ok; - const char * (*get_name)(gpointer); - GList * (*get_list)(QofBook*); - - gboolean building_menu; - gpointer result; - gpointer *result_p; - - void (*changed_cb)(GtkWidget*, gpointer); - gpointer cb_arg; -} OpMenuData; - -#define DO_ADD_ITEM(s,o) { \ - add_menu_item (menu, (s), omd, (o)); \ - if (omd->result == (o)) current = index; \ - index++; \ -} - -static void -business_option_changed (GtkWidget *widget, gpointer data) -{ - OpMenuData *omd = data; - - g_return_if_fail (omd); - omd->result = g_object_get_data (G_OBJECT (widget), "this_item"); - - if (!omd->building_menu) - { - if (omd->result_p) - *(omd->result_p) = omd->result; - - if (omd->changed_cb) - (omd->changed_cb)(omd->omenu, omd->cb_arg); - } -} - -static void -add_menu_item (GtkWidget *menu, const char *label, OpMenuData *omd, - gpointer this_item) -{ - GtkWidget *item = gtk_menu_item_new_with_label (label); - g_object_set_data (G_OBJECT (item), "this_item", this_item); - g_signal_connect (G_OBJECT (item), "activate", - G_CALLBACK (business_option_changed), omd); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - gtk_widget_show (item); -} - -static void -generic_omenu_destroy_cb (GtkWidget *widget, gpointer data) -{ - OpMenuData *omd = data; - - gnc_unregister_gui_component (omd->component_id); - g_free (omd); -} - -static void -build_generic_optionmenu (OpMenuData *omd) -{ - GList *items; - GtkWidget *menu; - int current = 0, index = 0; - - /* Make sure we can "get_list" */ - if (omd->get_list == NULL) - return; - - /* Get the list of items */ - items = (omd->get_list)(omd->book); - - /* Make a menu */ - menu = gtk_menu_new (); - - omd->building_menu = TRUE; - - if (omd->none_ok || items == NULL) - DO_ADD_ITEM (_("None"), NULL); - - for ( ; items; items = items->next) - DO_ADD_ITEM ((omd->get_name)(items->data), items->data); - - gtk_option_menu_set_menu (GTK_OPTION_MENU (omd->omenu), menu); - gtk_option_menu_set_history (GTK_OPTION_MENU (omd->omenu), current); - gtk_widget_show (menu); - - omd->building_menu = FALSE; -} - -static void -generic_omenu_refresh_handler (GHashTable *changes, gpointer user_data) -{ - OpMenuData *omd = user_data; - build_generic_optionmenu (omd); -} - -static OpMenuData * -make_generic_optionmenu (GtkWidget *omenu, QofBook *book, - gboolean none_ok, QofIdType type_name, - GList * (*get_list)(QofBook*), - GenericLookup_t get_name, - gpointer *result) -{ - OpMenuData *omd; - - omd = g_object_get_data (G_OBJECT (omenu), "menu-data"); - - /* If this is the first time we've been called, then build the - * Option Menu Data object, register with the component manager, and - * watch for changed items. Then register for deletion, so we can - * unregister and free the data when this menu is destroyed. - */ - if (!omd) - { - omd = g_new0 (OpMenuData, 1); - omd->omenu = omenu; - omd->book = book; - omd->result_p = result; - omd->none_ok = none_ok; - omd->get_name = get_name; - omd->get_list = get_list; - g_object_set_data (G_OBJECT (omenu), "menu-data", omd); - - if (result) - omd->result = *result; - - omd->component_id = - gnc_register_gui_component ("generic-omenu-refresh-hook", - generic_omenu_refresh_handler, - NULL, omd); - - - if (type_name) - gnc_gui_component_watch_entity_type (omd->component_id, - type_name, - QOF_EVENT_MODIFY | QOF_EVENT_DESTROY); - - g_signal_connect (G_OBJECT (omenu), "destroy", - G_CALLBACK (generic_omenu_destroy_cb), omd); - - } - - build_generic_optionmenu (omd); - - return omd; -} - -void -gnc_ui_optionmenu_set_changed_callback (GtkWidget *omenu, - void (*changed_cb)(GtkWidget*, gpointer), - gpointer cb_arg) -{ - OpMenuData *omd; - - if (!omenu) return; - - omd = g_object_get_data (G_OBJECT (omenu), "menu-data"); - g_return_if_fail (omd); - - omd->changed_cb = changed_cb; - omd->cb_arg = cb_arg; -} - -gpointer -gnc_ui_optionmenu_get_value (GtkWidget *omenu) -{ - OpMenuData *omd; - - if (!omenu) return NULL; - - omd = g_object_get_data (G_OBJECT (omenu), "menu-data"); - g_return_val_if_fail (omd, NULL); - - return omd->result; -} - -void -gnc_ui_optionmenu_set_value (GtkWidget *omenu, gpointer data) -{ - OpMenuData *omd; - GtkWidget *menu; - GList *node; - gint counter; - - if (!omenu) return; - - omd = g_object_get_data (G_OBJECT (omenu), "menu-data"); - g_return_if_fail (omd); - - menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu)); - g_return_if_fail (menu); - - /* now walk all the children until we find our object */ - for (counter = 0, node = ((GTK_MENU_SHELL (menu))->children); - node; - node = node->next, counter++) - { - GObject *menuitem = node->data; - gpointer this_object = g_object_get_data (menuitem, "this_item"); - - if (this_object == data) - { - gtk_option_menu_set_history (GTK_OPTION_MENU (omd->omenu), counter); - return; - } - } -} - -/* Create an optionmenu of available billing terms and attach it to - * the menu passed in. If none_ok is true, then add "none" as a - * choice (with data set to NULL). Any time the menu changes, - * 'choice' will be set to the chosen option. If *choice is non-NULL, - * then that will be the default option setting when the menu is - * created. - */ -void -gnc_ui_billterms_optionmenu (GtkWidget *omenu, QofBook *book, - gboolean none_ok, GncBillTerm **choice) -{ - if (!omenu || !book) return; - - make_generic_optionmenu (omenu, book, none_ok, GNC_BILLTERM_MODULE_NAME, - gncBillTermGetTerms, - (GenericLookup_t)gncBillTermGetName, - (gpointer *)choice); -} - -void -gnc_ui_taxtables_optionmenu (GtkWidget *omenu, QofBook *book, - gboolean none_ok, GncTaxTable **choice) -{ - if (!omenu || !book) return; - - make_generic_optionmenu (omenu, book, none_ok, GNC_TAXTABLE_MODULE_NAME, - gncTaxTableGetTables, - (GenericLookup_t)gncTaxTableGetName, - (gpointer *)choice); -} - -void -gnc_ui_taxincluded_optionmenu (GtkWidget *omenu, GncTaxIncluded *choice) -{ - GtkWidget *menu; - OpMenuData *omd; - int current = 0, index = 0; - - if (!omenu) return; - - omd = make_generic_optionmenu (omenu, NULL, FALSE, NULL, NULL, NULL, - (gpointer *)choice); - - g_return_if_fail (omd); - - menu = gtk_menu_new (); - - add_menu_item (menu, _("Yes"), omd, - GINT_TO_POINTER (GNC_TAXINCLUDED_YES)); - if (*choice == GNC_TAXINCLUDED_YES) current = index; - index++; - - add_menu_item (menu, _("No"), omd, - GINT_TO_POINTER (GNC_TAXINCLUDED_NO)); - if (*choice == GNC_TAXINCLUDED_NO) current = index; - index++; - - add_menu_item (menu, _("Use Global"), omd, - GINT_TO_POINTER (GNC_TAXINCLUDED_USEGLOBAL)); - if (*choice == GNC_TAXINCLUDED_USEGLOBAL) current = index; - index++; - - gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); - gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current); - gtk_widget_show (menu); -} - /*********************************************************************** * gnc_simple_combo implementation functions */ +typedef const char * (*GenericLookup_t)(gpointer); + typedef struct { gint component_id; diff --git a/src/business/business-gnome/business-gnome-utils.h b/src/business/business-gnome/business-gnome-utils.h index 9acdbe0e30..e2f57b17a8 100644 --- a/src/business/business-gnome/business-gnome-utils.h +++ b/src/business/business-gnome/business-gnome-utils.h @@ -63,38 +63,6 @@ void gnc_fill_account_select_combo (GtkWidget *combo, QofBook *book, GList *acct_types, GList *acct_commodities); - -/* Create an optionmenu of available billing terms and attach it to - * the menu passed in. If none_ok is true, then add "none" as a - * choice (with data set to NULL). Any time the menu changes, - * 'choice' will be set to the chosen option. If *choice is non-NULL, - * then that will be the default option setting when the menu is - * created. - */ -void gnc_ui_billterms_optionmenu (GtkWidget *omenu, QofBook *book, - gboolean none_ok, GncBillTerm **choice); - -/* Same thing except for the tax tables */ -void -gnc_ui_taxtables_optionmenu (GtkWidget *omenu, QofBook *book, - gboolean none_ok, GncTaxTable **choice); - -/* Build an option menu for choosing a GncTaxIncluded */ -void gnc_ui_taxincluded_optionmenu (GtkWidget *omenu, GncTaxIncluded *choice); - - -/* Here are some "generic option menu" utilities that can be used with - * ANY of the above option-menu types. In particular the following - * functions are useful for hooking the above option menus into the - * GNC Option infrastructure. - */ - -void gnc_ui_optionmenu_set_changed_callback (GtkWidget *omenu, - void (*changed_cb)(GtkWidget*, gpointer), - gpointer cb_arg); -gpointer gnc_ui_optionmenu_get_value (GtkWidget *omenu); -void gnc_ui_optionmenu_set_value (GtkWidget *omenu, gpointer data); - /* Create a combo box of available billing terms based on * the combo box If none_ok is true, then add "none" as a * choice (with data set to NULL). If inital_choice is non-NULL,