only for RuBoard - do not distribute or recompile |
The previous two sections concentrated on building the user interface and constructing the functions to do the majority of the work. Now put the two together to produce a final product.
Listing 7.17 lists all the callbacks from callbacks.c that have any code in them other than what Glade produces. (If you download callbacks.c for this project from the companion Web site, you will see more functions than are in Listing 7.17.)
#ifdef HAVE_CONFIG_H # include <config.h> #endif #include <gtk/gtk.h> #include <mysql.h> #include "callbacks.h" #include "interface.h" #include "support.h" #include "sesi_utils.h" GtkWidget *frm_main; GtkWidget *frm_items_ordered; GtkWidget *frm_find_item; GtkWidget *frm_find_customer; MYSQL *conx; gboolean need_to_save_edits; gboolean on_frm_main_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { g_print("on_frm_main_delete_event...\n"); gtk_main_quit(); /* The "return FALSE;" call below interrupts the * delete event. Change it to true to "not delete" * the form. In this case, terminating the application is * the desired behavior. So it is left as FALSE (the * default by Glade). */ return FALSE; } void on_frm_main_realize (GtkWidget *widget, gpointer user_data) { g_print("on_frm_main_realize event...\n"); connect_to_db(); } void on_cmd_search_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_search_clicked event...\n"); gtk_widget_show_all (frm_find_customer); } void on_cmd_save_edits_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_save_edits_clicked event...\n"); update_database(); need_to_save_edits = FALSE; gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), FALSE); } void on_cmd_select_items_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_select_items_clicked event...\n"); gtk_widget_show_all(frm_items_ordered); } void on_cmd_print_order_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_print_order_clicked event...\n"); write_order(); } void on_cmd_exit_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_exit_clicked event...\n"); gtk_widget_destroy(frm_main); gtk_main_quit(); } void on_combo_entry_customer_number_changed (GtkEditable *editable, gpointer user_data) { g_print("on_combo_entry_customer_number_changed event...\n"); fill_customer_info(); } gboolean on_frm_items_ordered_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { g_print("on_frm_items_ordered_delete_event...\n"); /* If the user clicks the "X" (close window) button in the top * right of the window, GTK+ will proceed to delete the window. * This is not the desired behavior; it is preferred that the * user click the "Done" button,, but since that cannot be * guaranteed, the software should still react correctly regardless * of which way the user attempts to close the window. Therefore, * the "return TRUE" call below halts the delete event for the * window. The next time the user opens the form, it will be * in the same state as it was when it was closed, which is * acceptable. * * Instead, hide the form first, then return the TRUE ('halt"). */ gtk_widget_hide(frm_items_ordered); return TRUE; } void on_frm_items_ordered_realize (GtkWidget *widget, gpointer user_data) { g_print("on_frm_items_ordered_realize event...\n"); fill_items_ordered(); } void on_frm_items_ordered_show (GtkWidget *widget, gpointer user_data) { g_print("on_frm_items_ordered_show event...\n"); /* Here is a bit of an afterthoughtthe numeric * columns in the CList widgets should be right * justified. This can, of course, be set from Glade; * however, that portion of this project is considered * stable, and it shouldn't be messed with "after the * fact." Therefore, the justification can be set here, * and incorporated into the Glade project file for * the next version. * gtk_clist_set_column_justification(GTK_CLIST(lookup_widget(frm_items_ordered, "clist_items")), 2, GTK_JUSTIFY_RIGHT); gtk_clist_set_column_justification(GTK_CLIST(lookup_widget(frm_items_ordered, "clist_items_ordered")), 2, GTK_JUSTIFY_RIGHT); gtk_clist_set_column_justification(GTK_CLIST(lookup_widget(frm_items_ordered, "clist_items_ordered")), 3, GTK_JUSTIFY_RIGHT); } void on_cmd_Add_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_Add_clicked event...\n"); speed_add(); } void on_cmd_search_for_item_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_search_for_item_clicked event...\n"); gtk_widget_show_all (frm_find_item); } void on_cmd_done_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_done_clicked event...\n"); gtk_widget_hide (frm_items_ordered); } void on_cmd_add_down_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_add_down_clicked event...\n"); slow_add(); } void on_cmd_remove_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_remove_clicked event...\n"); remove_ordered_item(); } void on_clist_items_select_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { g_print("on_clist_items_select_row event...\n"); g_print("row is %i...\n", row); } void on_clist_items_ordered_select_row (GtkCList *clist, gint row, gint column, GdkEvent *event, gpointer user_data) { g_print("on_clist_items_ordered_select_row event...\n"); g_print("Row to remove is %i\n", row); } void on_frm_main_show (GtkWidget *widget, gpointer user_data) { g_print("on_frm_main_show event...\n"); gtk_combo_set_popdown_strings(GTK_COMBO (lookup_widget(frm_main, "cbo_customer_number")), get_customer_numbers()); } gboolean on_frm_find_customer_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { g_print("on_frm_find_customer_delete_event...\n"); /* Returning true halts the delete event. */ gtk_widget_hide(frm_find_customer); return TRUE; } void on_cmd_find_customer_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_find_customer_clicked event...\n"); enter_found_customers((gchar *) gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(frm_find_customer, "entry_find_customer")), 0, -1)); } void on_cmd_find_customer_done_clicked (GtkButton *button, gpointer user_data) { gchar *target_customer; GtkCList *clist_target; gint row_target; g_print("on_cmd_find_customer_done_clicked event...\n"); /* Get the customer number of the selected row in * clist_found_customer, and send it to select_customer(). */ clist_target = GTK_CLIST(lookup_widget(frm_find_customer, "clist_found_customer")); row_target = (gint) g_list_nth_data ((clist_target)->selection, 0); gtk_clist_get_text(clist_target, row_target, 0, &target_customer); g_print("Target customer is: %s\n", target_customer); select_customer(target_customer); /* Hide the form. */ gtk_widget_hide (frm_find_customer); } gboolean on_frm_find_item_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { g_print("on_frm_find_item_delete_event...\n"); /* Returning true halts the delete event. */ gtk_widget_hide(frm_find_item); return TRUE; } void on_cmd_find_item_clicked (GtkButton *button, gpointer user_data) { g_print("on_cmd_find_item_clicked event...\n"); enter_found_items((gchar *) gtk_editable_get_chars(GTK_EDITABLE(lookup_widget(frm_find_item, "entry_find_item")), 0, -1)); } void on_cmd_find_item_done_clicked (GtkButton *button, gpointer user_data) { gchar *target_item; GtkCList *clist_target; gint row_target; g_print("on_cmd_find_item_done_clicked event...\n"); /* Get the item number of the selected row in clist_items_found, * and send it to select_item(). */ clist_target = GTK_CLIST(lookup_widget(frm_find_item, "clist_found_items")); row_target = (gint) g_list_nth_data ((clist_target)->selection, 0); gtk_clist_get_text(clist_target, row_target, 0, &target_item); select_item(target_item); /* Hide the form. */ gtk_widget_hide (frm_find_item); } void on_entry_customer_name_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_customer_name_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_last_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_last_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_first_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_first_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_title_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_title_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_phone_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_phone_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_ship_to_addr1_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_ship_to_addr1_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_ship_to_addr2_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_ship_to_addr2_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_bill_to_addr2_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_bill_to_addr2_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_ship_to_city_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_ship_to_city_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_ship_to_st_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_ship_to_st_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_ship_to_zip_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_ship_to_zip_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_bill_to_city_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_bill_to_city_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_bill_to_st_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_bill_to_st_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_entry_bill_to_zip_changed (GtkEditable *editable, gpointer user_data) { g_print("on_entry_bill_to_zip_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; } void on_txt_customer_comments_changed (GtkEditable *editable, gpointer user_data) { g_print("on_txt_customer_comments_changed event...\n"); gtk_widget_set_sensitive(lookup_widget(frm_main, "cmd_save_edits"), TRUE); need_to_save_edits = TRUE; }
In closing, Listing 7.18 is main.c from this application. Once Glade has written this file, it will not overwrite it. That means you can change it, but if you need Glade to create a new one, you will have to delete or rename the existing one.
/* * Initial main.c file generated by Glade. Edit as required. * Glade will not overwrite this file. */ #ifdef HAVE_CONFIG_H # include <config.h> #endif #include <gtk/gtk.h> #include <mysql.h> #include "interface.h" #include "support.h" GtkWidget *frm_main; GtkWidget *frm_items_ordered; GtkWidget *frm_find_item; GtkWidget *frm_find_customer; MYSQL *conx; int main (int argc, char *argv[]) { gtk_set_locale (); gtk_init (&argc, &argv); /* * The following code was added by Glade to create one of each * component (except popup menus), just so that you see something * after building the project. Delete any components you * don't want shown initially. */ frm_main = create_frm_main (); gtk_widget_show (frm_main); frm_items_ordered = create_frm_items_ordered(); frm_find_item = create_frm_find_item(); frm_find_customer = create_frm_find_customer(); gtk_main (); return 0; }
Notice that all four of the windows are created, but only frm_main is shown at this point.The others are shown and hidden as needed.
only for RuBoard - do not distribute or recompile |