testbbox.c 4.77 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Copyright (C) 2006 Nokia Corporation.
 * Author: Xan Lopez <xan.lopez@nokia.com>
 *
 * 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
Javier Jardón's avatar
Javier Jardón committed
15
 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16 17 18 19 20 21 22 23 24 25
 *
 */

#include <gtk/gtk.h>

#define N_BUTTONS 3

GtkWidget *bbox = NULL;
GtkWidget *hbbox = NULL, *vbbox = NULL;

26
static const char* styles[] = { "GTK_BUTTONBOX_SPREAD",
27 28 29 30
				"GTK_BUTTONBOX_EDGE",
				"GTK_BUTTONBOX_START",
				"GTK_BUTTONBOX_END",
				"GTK_BUTTONBOX_CENTER",
31
				"GTK_BUTTONBOX_EXPAND",
32 33 34 35 36 37 38
				NULL};

static const char* types[] = { "GtkHButtonBox",
			       "GtkVButtonBox",
			       NULL};

static void
39
populate_combo_with (GtkComboBoxText *combo, const char** elements)
40 41 42 43
{
  int i;
  
  for (i = 0; elements[i] != NULL; i++) {
44
    gtk_combo_box_text_append_text (combo, elements[i]);
45 46
  }
  
47
  gtk_combo_box_set_active (GTK_COMBO_BOX (combo), 0);
48 49 50
}

static void
51
combo_changed_cb (GtkComboBoxText *combo,
52 53
		  gpointer user_data)
{
54 55 56 57
  gint active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));

  gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox),
			     (GtkButtonBoxStyle) (active + 1));
58 59 60 61 62 63 64
}

static void
reparent_widget (GtkWidget *widget,
		 GtkWidget *old_parent,
		 GtkWidget *new_parent)
{
65
  g_object_ref (widget);
66 67
  gtk_container_remove (GTK_CONTAINER (old_parent), widget);
  gtk_container_add (GTK_CONTAINER (new_parent), widget);
68
  g_object_unref (widget);
69 70 71
}

static void
72
combo_types_changed_cb (GtkComboBoxText *combo,
73 74 75 76 77
			GtkWidget **buttons)
{
  int i;
  GtkWidget *old_parent, *new_parent;
  GtkButtonBoxStyle style;
78 79 80 81

  gint active = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));

  if (active == GTK_ORIENTATION_HORIZONTAL) {
82 83 84 85 86 87
    old_parent = vbbox;
    new_parent = hbbox;
  } else {
    old_parent = hbbox;
    new_parent = vbbox;
  }
88

89
  bbox = new_parent;
90

91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
  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);
  
126
  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
127 128 129 130
  gtk_container_add (GTK_CONTAINER (window), vbox);
  
  /* GtkHButtonBox */
  
131
  hbbox = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
132 133 134 135 136 137 138 139
  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;
140 141

  gtk_button_box_set_layout (GTK_BUTTON_BOX (hbbox), GTK_BUTTONBOX_SPREAD);
142 143
  
  /* GtkVButtonBox */
144
  vbbox = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
145 146 147 148
  gtk_box_pack_start (GTK_BOX (vbox), vbbox, TRUE, TRUE, 5);
  
  /* Options */
  
149
  hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
150 151
  gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
  
152 153
  combo_types = gtk_combo_box_text_new ();
  populate_combo_with (GTK_COMBO_BOX_TEXT (combo_types), types);
154 155 156
  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);
  
157 158
  combo_styles = gtk_combo_box_text_new ();
  populate_combo_with (GTK_COMBO_BOX_TEXT (combo_styles), styles);
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
  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;
}