]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/item_factory.c
Fixes from David Hampton <hampton@employees.org> via gtk-devel-list.
[~andy/gtk] / demos / gtk-demo / item_factory.c
1 /* Item Factory
2  *
3  * The GtkItemFactory object allows the easy creation of menus
4  * from an array of descriptions of menu items.
5  */
6
7 #include <gtk/gtk.h>
8
9 static void
10 gtk_ifactory_cb (gpointer   callback_data,
11                  guint      callback_action,
12                  GtkWidget *widget)
13 {
14   g_message ("ItemFactory: activated \"%s\"",
15              gtk_item_factory_path_from_widget (widget));
16 }
17
18 static GtkItemFactoryEntry menu_items[] =
19 {
20   { "/_File",            NULL,         0,                     0, "<Branch>" },
21   { "/File/tearoff1",    NULL,         gtk_ifactory_cb,       0, "<Tearoff>" },
22   { "/File/_New",        "<control>N", gtk_ifactory_cb,       0 },
23   { "/File/_Open",       "<control>O", gtk_ifactory_cb,       0 },
24   { "/File/_Save",       "<control>S", gtk_ifactory_cb,       0 },
25   { "/File/Save _As...", NULL,         gtk_ifactory_cb,       0 },
26   { "/File/sep1",        NULL,         gtk_ifactory_cb,       0, "<Separator>" },
27   { "/File/_Quit",       "<control>Q", gtk_ifactory_cb,       0 },
28
29   { "/_Preferences",                    NULL, 0,               0, "<Branch>" },
30   { "/_Preferences/_Color",             NULL, 0,               0, "<Branch>" },
31   { "/_Preferences/Color/_Red",         NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
32   { "/_Preferences/Color/_Green",       NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
33   { "/_Preferences/Color/_Blue",        NULL, gtk_ifactory_cb, 0, "/Preferences/Color/Red" },
34   { "/_Preferences/_Shape",             NULL, 0,               0, "<Branch>" },
35   { "/_Preferences/Shape/_Square",      NULL, gtk_ifactory_cb, 0, "<RadioItem>" },
36   { "/_Preferences/Shape/_Rectangle",   NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Square" },
37   { "/_Preferences/Shape/_Oval",        NULL, gtk_ifactory_cb, 0, "/Preferences/Shape/Rectangle" },
38
39   { "/_Help",            NULL,         0,                     0, "<LastBranch>" },
40   { "/Help/_About",      NULL,         gtk_ifactory_cb,       0 },
41 };
42
43 static int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
44
45 GtkWidget *
46 do_item_factory (void)
47 {
48   static GtkWidget *window = NULL;
49   
50   if (!window)
51     {
52       GtkWidget *box1;
53       GtkWidget *box2;
54       GtkWidget *separator;
55       GtkWidget *label;
56       GtkWidget *button;
57       GtkAccelGroup *accel_group;
58       GtkItemFactory *item_factory;
59       
60       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
61       
62       g_signal_connect (window, "destroy",
63                         G_CALLBACK (gtk_widget_destroyed), &window);
64       g_signal_connect (window, "delete-event",
65                         G_CALLBACK (gtk_true), NULL);
66       
67       accel_group = gtk_accel_group_new ();
68       item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", accel_group);
69       g_object_set_data_full (G_OBJECT (window), "<main>",
70                               item_factory, (GDestroyNotify) g_object_unref);
71       gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
72       gtk_window_set_title (GTK_WINDOW (window), "Item Factory");
73       gtk_container_set_border_width (GTK_CONTAINER (window), 0);
74       gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
75
76       /* preselect /Preferences/Shape/Oval over the other radios
77        */
78       gtk_check_menu_item_set_active
79         (GTK_CHECK_MENU_ITEM (gtk_item_factory_get_item (item_factory,
80                                                          "/Preferences/Shape/Oval")),
81          TRUE);
82
83       box1 = gtk_vbox_new (FALSE, 0);
84       gtk_container_add (GTK_CONTAINER (window), box1);
85       
86       gtk_box_pack_start (GTK_BOX (box1),
87                           gtk_item_factory_get_widget (item_factory, "<main>"),
88                           FALSE, FALSE, 0);
89
90       label = gtk_label_new ("Type\n<alt>\nto start");
91       gtk_widget_set_size_request (label, 200, 200);
92       gtk_misc_set_alignment (GTK_MISC (label), 0.5, 0.5);
93       gtk_box_pack_start (GTK_BOX (box1), label, TRUE, TRUE, 0);
94
95
96       separator = gtk_hseparator_new ();
97       gtk_box_pack_start (GTK_BOX (box1), separator, FALSE, TRUE, 0);
98
99
100       box2 = gtk_vbox_new (FALSE, 10);
101       gtk_container_set_border_width (GTK_CONTAINER (box2), 10);
102       gtk_box_pack_start (GTK_BOX (box1), box2, FALSE, TRUE, 0);
103
104       button = gtk_button_new_with_label ("close");
105       g_signal_connect_swapped (button, "clicked",
106                                 G_CALLBACK (gtk_widget_destroy), window);
107       gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE, 0);
108       GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
109       gtk_widget_grab_default (button);
110
111       gtk_widget_show_all (window);
112     }
113   else
114     {
115       gtk_widget_destroy (window);
116       window = NULL;
117     }
118
119   return window;
120 }