[ Pobierz całość w formacie PDF ]
.doc Strona 54z 67 menu = create_dvd_popup_menu();if (event->type == GDK_BUTTON_PRESS){GdkEventButton *buttonevent = (GdkEventButton *) event;if ( buttonevent->button == GDK_BUTTON1_MASK ){clist = GTK_CLIST(widget);if (gtk_clist_get_selection_info(clist,buttonevent->x,buttonevent->y,&row,&column)) {gtk_clist_select_rows(clist, row, column);selected_row = row;gtk_menu_popup ( GTK_MENU (menu), NULL, NULL, NULL, NULL,buttonevent->button, 0 );return TRUE;}}}return FALSE;}Pozostałe funkcje są wywołaniami zwrotnymi dla czterech pozycji menu kontekstowego: Rent,Reserve, Edit oraz Delete.on_search_menu_rent_activateFunkcja ta stwierdza, czy otwarta jest zakładka dla tytułów, czy dla klientów; następnie wywołujedo_rent_dvd_dialog, przekazując jako argument identyfikator tytułu lub klienta dla wybranegowiersza:voidon_search_menu_rent_activate (GtkMenuItem *menuitem,gpointer user_data){gint current_page;R-09-07.doc Strona 55z 67 gint id;dvd_store_member member;current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK(lookup_widget(search_window, "search_notebook")));if (current_page == TITLE_PAGE){g_return_if_fail (title_search_slist != NULL);id = GPOINTER_TO_INT(G_slist_nth_data(title_search_slist,selected_row));do_rent_dvd_dialog(NULL, id);}if (current_page == MEMBER_PAGE) {g_return_if_fail (member_search_slist != NULL);id = GPOINTER_TO_INT(g_slist_nth_data(member_search_slist,selected_row));dvd_member_get(id, &member);do_rent_dvd_dialog(member.member_no, 0);}}on_search_menu_edit_activatevoidon_search_menu_edit_activate (GtkMenuItem *menuitem,gpointer user_data){gint current_page;gint id;g_return_if_fail (search_window != NULL);current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK(lookup_widget(search_window, "search_notebook")));if (current_page == TITLE_PAGE){g_return_if_fail (title_search_slist != NULL);R-09-07.doc Strona 56z 67 id = GPOINTER_TO_INT(g_slist_nth_data(title_search_slist,selected_row));do_dvd_dialog(id);}if (current_page == MEMBER_PAGE){g_return_if_fail (member_search_slist != NULL);id = GPOINTER_TO_INT(g_slist_nth_data(member_search_slist,selected_row));do_member_dialog(id);}}on_search_menu_delete_activateFunkcja delete_activate żąda od użytkownika potwierdzenia zamiaru usunięcia wybranejpozycji z listy tytułów lub klientów, wyświetlając okno dialogowe Gnome:voidon_search_menu_delete_activate (GtkMenuItem *menuitem,gpointer user_data){GtkWidget *dialog;gint id;gint reply;gint current_page;g_return_if_fail (search_window != NULL);current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK(lookup_widget(search_window, "search_notebook")));if (current_page == TITLE_PAGE){g_return_if_fail (title_search_slist != NULL);id = GPOINTER_TO_INT(g_slist_nth_data(title_search_slist,selected_row));dialog = gnome_message_box_new(_("Delete this Title?"),GNOME_MESSAGE_BOX_QUESTION,R-09-07.doc Strona 57z 67 GNOME_STOCK_BUTTON_YES,GNOME_STOCK_BUTTON_NO,NULL);gtk_widget_show(dialog);reply = gnome_dialog_run(GNOME_DIALOG(dialog));if (reply == GNOME_OK) {dvd_title_delete(id);title_search_slist = g_slist_remove (title_search_slist,GINT_TO_POINTER(id));update_title_search_clist();}}if (current_page == MEMBER_PAGE){g_return_if_fail (member_search_slist != NULL);id = GPOINTER_TO_INT(g_slist_nth_data(member_search_slist,selected_row));dialog = gnome_message_box_new(_("Delete this Member?"),GNOME_MESSAGE_BOX_QUESTION,GNOME_STOCK_BUTTON_OK,GNOME_STOCK_BUTTON_CANCEL,NULL);reply = gnome_dialog_run(GNOME_DIALOG(dialog));if (reply == GNOME_OK){dvd_member_delete(id);member_search_slsist = g_slist_remove (member_search_slist,GINT_TO_POINTER(id));update_member_search_clist();}}}on_search_menu_reserve_activateR-09-07.doc Strona 58z 67voidon_search_menu_reserve_activate (GtkMenuItem *menuitem,gpointer user_data){gint current_page;gint id;g_return_if_fail (search_window != NULL);current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK(lookup_widget(search_window, "search_notebook")));if (current_page == TITLE_PAGE){g_return_if_fail (title_search_slist != NULL);id = GPOINTER_TO_INT(g_slist_nth_data(title_search_slist,selected_row));do_reserve_dialog(0, id);}if (current_page == MEMBER_PAGE){g_return_if_fail (member_search_slist != NULL);id = GPOINTER_TO_INT(g_slist_nth_data(member_search_slist,selected_row));do_reserve_dialog(id, 0);}}misc.cOstatnim plikiem zródłowym, który tu omówimy, jest misc.c zawierający różne funkcjepomocnicze.Tutaj inicjujemy deskryptor pliku zawierającego log oraz zmienną typu gbooleanopisującą stan połączenia z bazą danych.Makrodefinicja SET_SENSITIVE służy do ustawianiastanu aktywności widżetów zgodnie z wartością zmiennej sensitive.static FILE *logfile;static gboolean connected = FALSE;#define SET_SENSITIVE(widget)R-09-07.doc Strona 59z 67 gtk_widget_set_sensitive(GTK_WIDGET(lookup_widget(main_window, #widget)), sensitive)dvd_store_connectFunkcja ta obsługuje potwierdzanie tożsamości użytkownika i jego logowanie do bazy.Zmiennauser jest zmienną globalną, której wartość jest pobierana z wiersza poleceń, jeżeli była użytaopcja --username:voiddvd_store_connect(){GtkWidget *login_dialog;GtkWidget *gtk_username_entry;gchar *msg;gint reply;gint result;Jeśli opcja --username nie była użyta, to zmienna user ma wartość NULL i wówczas tworzonejest okno dialogowe logowania
[ Pobierz całość w formacie PDF ]