/* * Copyright (C) 2006 Nokia Corporation. * Author: Xan Lopez * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * version 2.1 as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * */ #include #define N_BUTTONS 3 GtkWidget *bbox = NULL; GtkWidget *hbbox = NULL, *vbbox = NULL; static const char* styles[] = { "GTK_BUTTONBOX_DEFAULT_STYLE", "GTK_BUTTONBOX_SPREAD", "GTK_BUTTONBOX_EDGE", "GTK_BUTTONBOX_START", "GTK_BUTTONBOX_END", "GTK_BUTTONBOX_CENTER", NULL}; static const char* types[] = { "GtkHButtonBox", "GtkVButtonBox", NULL}; static void populate_combo_with (GtkComboBoxText *combo, const char** elements) { int i; for (i = 0; elements[i] != NULL; i++) { gtk_combo_box_text_append_text (combo, elements[i]); } gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0); } static void combo_changed_cb (GtkComboBoxText *combo, gpointer user_data) { char *text; int i; text = gtk_combo_box_text_get_active_text (combo); for (i = 0; styles[i]; i++) { if (g_str_equal (text, styles[i])) { gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), (GtkButtonBoxStyle)i); } } } static void reparent_widget (GtkWidget *widget, GtkWidget *old_parent, GtkWidget *new_parent) { g_object_ref (widget); gtk_container_remove (GTK_CONTAINER (old_parent), widget); gtk_container_add (GTK_CONTAINER (new_parent), widget); g_object_unref (widget); } static void combo_types_changed_cb (GtkComboBoxText *combo, GtkWidget **buttons) { int i; char *text; GtkWidget *old_parent, *new_parent; GtkButtonBoxStyle style; text = gtk_combo_box_text_get_active_text (combo); if (g_str_equal (text, "GtkHButtonBox")) { old_parent = vbbox; new_parent = hbbox; } else { old_parent = hbbox; new_parent = vbbox; } bbox = new_parent; for (i = 0; i < N_BUTTONS; i++) { reparent_widget (buttons[i], old_parent, new_parent); } gtk_widget_hide (old_parent); style = gtk_button_box_get_layout (GTK_BUTTON_BOX (old_parent)); gtk_button_box_set_layout (GTK_BUTTON_BOX (new_parent), style); gtk_widget_show (new_parent); } static void option_cb (GtkToggleButton *option, GtkWidget *button) { gboolean active = gtk_toggle_button_get_active (option); gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (bbox), button, active); } static const char* strings[] = { "Ok", "Cancel", "Help" }; int main (int argc, char **argv) { GtkWidget *window, *buttons[N_BUTTONS]; GtkWidget *vbox, *hbox, *combo_styles, *combo_types, *option; int i; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); g_signal_connect (G_OBJECT (window), "delete-event", G_CALLBACK (gtk_main_quit), NULL); vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); /* GtkHButtonBox */ hbbox = gtk_hbutton_box_new (); gtk_box_pack_start (GTK_BOX (vbox), hbbox, TRUE, TRUE, 5); for (i = 0; i < N_BUTTONS; i++) { buttons[i] = gtk_button_new_with_label (strings[i]); gtk_container_add (GTK_CONTAINER (hbbox), buttons[i]); } bbox = hbbox; /* GtkVButtonBox */ vbbox = gtk_vbutton_box_new (); gtk_box_pack_start (GTK_BOX (vbox), vbbox, TRUE, TRUE, 5); /* Options */ hbox = gtk_hbox_new (FALSE, 0); gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); combo_types = gtk_combo_box_text_new (); populate_combo_with (GTK_COMBO_BOX_TEXT (combo_types), types); g_signal_connect (G_OBJECT (combo_types), "changed", G_CALLBACK (combo_types_changed_cb), buttons); gtk_box_pack_start (GTK_BOX (hbox), combo_types, TRUE, TRUE, 0); combo_styles = gtk_combo_box_text_new (); populate_combo_with (GTK_COMBO_BOX_TEXT (combo_styles), styles); g_signal_connect (G_OBJECT (combo_styles), "changed", G_CALLBACK (combo_changed_cb), NULL); gtk_box_pack_start (GTK_BOX (hbox), combo_styles, TRUE, TRUE, 0); option = gtk_check_button_new_with_label ("Help is secondary"); g_signal_connect (G_OBJECT (option), "toggled", G_CALLBACK (option_cb), buttons[N_BUTTONS - 1]); gtk_box_pack_start (GTK_BOX (hbox), option, FALSE, FALSE, 0); gtk_widget_show_all (window); gtk_widget_hide (vbbox); gtk_main (); return 0; }