only for RuBoard - do not distribute or recompile |
The GtkNotebook widget is what VB developers might be used to calling a tab control. It has a number of tabs that the user clicks on to allow controls to exist in the same space; it hides and shows groups of controls at the same time, which have been placed together on a page (meaning that a tab shows a page, to use the terminology of some Windows tab controls).
The demo Notebook program is shown in Figure 4.6; its associated listing is of course Listing 4.6. In this program, note that you can add pages dynamically (as you can with all GTK+ widgets).
#include <gtk/gtk.h> GtkWidget *frm_notebook; GtkWidget *notebook_main; GtkWidget *fixed_page1; GtkWidget *vbox_page2; void destroy_main(); void cmd_rotate_tabs_clicked(); void cmd_set_tabs_homogeneous_clicked(); void cmd_set_tabs_heterogeneous_clicked(); void cmd_add_page_clicked(); void cmd_get_page_index_clicked(); void notebook_switch_page(); gint main(gint argc, gchar *argv[]) { GtkWidget *cmd_rotate_tabs; GtkWidget *cmd_set_tabs_homogeneous, *cmd_set_tabs_heterogeneous; GtkWidget *cmd_add_page, *cmd_get_page_index; GtkWidget *lbl_tab1, *lbl_tab2; gtk_init(&argc, &argv); frm_notebook = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(frm_notebook), "Notebook Window Demo"); gtk_signal_connect(GTK_OBJECT(frm_notebook), "destroy", GTK_SIGNAL_FUNC(destroy_main), NULL); notebook_main = gtk_notebook_new(); gtk_signal_connect(GTK_OBJECT(notebook_main), "switch-page", GTK_SIGNAL_FUNC(notebook_switch_page), NULL); /* Page 1 in the Notebook widget */ fixed_page1 = gtk_fixed_new(); lbl_tab1 = gtk_label_new("Tab 1"); cmd_rotate_tabs = gtk_button_new_with_label("Rotate Tabs"); gtk_signal_connect(GTK_OBJECT(cmd_rotate_tabs), "clicked", GTK_SIGNAL_FUNC(cmd_rotate_tabs_clicked), NULL); cmd_set_tabs_homogeneous = gtk_button_new_with_label("Set Tabs Homogeneous"); gtk_signal_connect(GTK_OBJECT(cmd_set_tabs_homogeneous), "clicked", GTK_SIGNAL_FUNC(cmd_set_tabs_homogeneous_clicked), NULL); cmd_set_tabs_heterogeneous = gtk_button_new_with_label("Set Tabs Heterogeneous"); gtk_signal_connect(GTK_OBJECT(cmd_set_tabs_heterogeneous), "clicked", GTK_SIGNAL_FUNC(cmd_set_tabs_heterogeneous_clicked), NULL); gtk_fixed_put(GTK_FIXED(fixed_page1), cmd_rotate_tabs, 20, 20); gtk_fixed_put(GTK_FIXED(fixed_page1), cmd_set_tabs_homogeneous, 20, 50); gtk_fixed_put(GTK_FIXED(fixed_page1), cmd_set_tabs_heterogeneous, 20, 80); gtk_notebook_append_page(GTK_NOTEBOOK(notebook_main), fixed_page1, lbl_tab1); /* Now page 2 */ vbox_page2 = gtk_vbox_new(TRUE, 0); cmd_add_page = gtk_button_new_with_label("Add a Page"); gtk_signal_connect(GTK_OBJECT(cmd_add_page), "clicked", GTK_SIGNAL_FUNC(cmd_add_page_clicked), NULL); cmd_get_page_index = gtk_button_new_with_label("Get Page Index"); gtk_signal_connect(GTK_OBJECT(cmd_get_page_index), "clicked", GTK_SIGNAL_FUNC(cmd_get_page_index_clicked), NULL); gtk_box_pack_start_defaults(GTK_BOX(vbox_page2), cmd_add_page); gtk_box_pack_start_defaults(GTK_BOX(vbox_page2), cmd_get_page_index); lbl_tab2 = gtk_label_new("Second Tab"); gtk_notebook_append_page(GTK_NOTEBOOK(notebook_main), vbox_page2, lbl_tab2); /* End of second tab. You're ready for the final assembly of the * main window. */ gtk_container_add(GTK_CONTAINER(frm_notebook), notebook_main); gtk_widget_show_all (frm_notebook); gtk_main (); return 0; } void destroy_main() { gtk_main_quit(); } void cmd_rotate_tabs_clicked() { static gint tab_location = 1; if (tab_location == 4) tab_location = 1; else tab_location++; switch (tab_location) { case 1: gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook_main), GTK_POS_TOP); break; case 2: gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook_main), GTK_POS_RIGHT); break; case 3: gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook_main), GTK_POS_BOTTOM); break; case 4: gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook_main), GTK_POS_LEFT); break; default: g_print("Should never reach this line.\n"); } } void cmd_set_tabs_homogeneous_clicked() { gtk_notebook_set_homogeneous_tabs(GTK_NOTEBOOK(notebook_main), TRUE); } void cmd_set_tabs_heterogeneous_clicked() { /* You will notice that this has no effect when the location of the * tabs is left or right. The behavior is the same as that of the * cmd_set_tabs_homogeneous_clicked() * call in that case. */ gtk_notebook_set_homogeneous_tabs(GTK_NOTEBOOK(notebook_main), FALSE); } void cmd_add_page_clicked() { GtkWidget *fixed; GtkWidget *lbl; fixed = gtk_fixed_new(); lbl = gtk_label_new("New"); gtk_notebook_append_page(GTK_NOTEBOOK(notebook_main), fixed, lbl); /* Again, the following acts as a "refresh" command. */ gtk_widget_show_all(notebook_main); } void cmd_get_page_index_clicked() { /* Notebook page indices are zero-based. */ g_print("Page index is %i.\n", gtk_notebook_get_current_page(GTK_NOTEBOOK(notebook_main))); } void notebook_switch_page() { g_print("page switched.\n"); }
only for RuBoard - do not distribute or recompile |