]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/dialog.c
Use gtk_box_new() instead gtk_[v|h]box_new()
[~andy/gtk] / demos / gtk-demo / dialog.c
1 /* Dialog and Message Boxes
2  *
3  * Dialog widgets are used to pop up a transient window for user feedback.
4  */
5
6 #include <gtk/gtk.h>
7
8 static GtkWidget *window = NULL;
9 static GtkWidget *entry1 = NULL;
10 static GtkWidget *entry2 = NULL;
11
12 static void
13 message_dialog_clicked (GtkButton *button,
14                         gpointer   user_data)
15 {
16   GtkWidget *dialog;
17   static gint i = 1;
18
19   dialog = gtk_message_dialog_new (GTK_WINDOW (window),
20                                    GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
21                                    GTK_MESSAGE_INFO,
22                                    GTK_BUTTONS_OK,
23                                    "This message box has been popped up the following\n"
24                                    "number of times:");
25   gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
26                                             "%d", i);
27   gtk_dialog_run (GTK_DIALOG (dialog));
28   gtk_widget_destroy (dialog);
29   i++;
30 }
31
32 static void
33 interactive_dialog_clicked (GtkButton *button,
34                             gpointer   user_data)
35 {
36   GtkWidget *content_area;
37   GtkWidget *dialog;
38   GtkWidget *hbox;
39   GtkWidget *stock;
40   GtkWidget *table;
41   GtkWidget *local_entry1;
42   GtkWidget *local_entry2;
43   GtkWidget *label;
44   gint response;
45
46   dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
47                                         GTK_WINDOW (window),
48                                         GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
49                                         GTK_STOCK_OK,
50                                         GTK_RESPONSE_OK,
51                                         "_Non-stock Button",
52                                         GTK_RESPONSE_CANCEL,
53                                         NULL);
54
55   content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
56
57   hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 8);
58   gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
59   gtk_box_pack_start (GTK_BOX (content_area), hbox, FALSE, FALSE, 0);
60
61   stock = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
62   gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
63
64   table = gtk_table_new (2, 2, FALSE);
65   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
66   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
67   gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
68   label = gtk_label_new_with_mnemonic ("_Entry 1");
69   gtk_table_attach_defaults (GTK_TABLE (table),
70                              label,
71                              0, 1, 0, 1);
72   local_entry1 = gtk_entry_new ();
73   gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (entry1)));
74   gtk_table_attach_defaults (GTK_TABLE (table), local_entry1, 1, 2, 0, 1);
75   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry1);
76
77   label = gtk_label_new_with_mnemonic ("E_ntry 2");
78   gtk_table_attach_defaults (GTK_TABLE (table),
79                              label,
80                              0, 1, 1, 2);
81
82   local_entry2 = gtk_entry_new ();
83   gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (entry2)));
84   gtk_table_attach_defaults (GTK_TABLE (table), local_entry2, 1, 2, 1, 2);
85   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
86   
87   gtk_widget_show_all (hbox);
88   response = gtk_dialog_run (GTK_DIALOG (dialog));
89
90   if (response == GTK_RESPONSE_OK)
91     {
92       gtk_entry_set_text (GTK_ENTRY (entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
93       gtk_entry_set_text (GTK_ENTRY (entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
94     }
95
96   gtk_widget_destroy (dialog);
97 }
98
99 GtkWidget *
100 do_dialog (GtkWidget *do_widget)
101 {
102   GtkWidget *frame;
103   GtkWidget *vbox;
104   GtkWidget *vbox2;
105   GtkWidget *hbox;
106   GtkWidget *button;
107   GtkWidget *table;
108   GtkWidget *label;
109   
110   if (!window)
111     {
112       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
113       gtk_window_set_screen (GTK_WINDOW (window),
114                              gtk_widget_get_screen (do_widget));
115       gtk_window_set_title (GTK_WINDOW (window), "Dialogs");
116
117       g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
118       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
119
120       frame = gtk_frame_new ("Dialogs");
121       gtk_container_add (GTK_CONTAINER (window), frame);
122
123       vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 8);
124       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
125       gtk_container_add (GTK_CONTAINER (frame), vbox);
126
127       /* Standard message dialog */
128       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 8);
129       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
130       button = gtk_button_new_with_mnemonic ("_Message Dialog");
131       g_signal_connect (button, "clicked",
132                         G_CALLBACK (message_dialog_clicked), NULL);
133       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
134
135       gtk_box_pack_start (GTK_BOX (vbox), gtk_separator_new (GTK_ORIENTATION_HORIZONTAL),
136                           FALSE, FALSE, 0);
137
138       /* Interactive dialog*/
139       hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 8);
140       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
141       vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE, 0);
142
143       button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
144       g_signal_connect (button, "clicked",
145                         G_CALLBACK (interactive_dialog_clicked), NULL);
146       gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
147       gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
148
149       table = gtk_table_new (2, 2, FALSE);
150       gtk_table_set_row_spacings (GTK_TABLE (table), 4);
151       gtk_table_set_col_spacings (GTK_TABLE (table), 4);
152       gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
153
154       label = gtk_label_new_with_mnemonic ("_Entry 1");
155       gtk_table_attach_defaults (GTK_TABLE (table),
156                                  label,
157                                  0, 1, 0, 1);
158
159       entry1 = gtk_entry_new ();
160       gtk_table_attach_defaults (GTK_TABLE (table), entry1, 1, 2, 0, 1);
161       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry1);
162
163       label = gtk_label_new_with_mnemonic ("E_ntry 2");
164       
165       gtk_table_attach_defaults (GTK_TABLE (table),
166                                  label,
167                                  0, 1, 1, 2);
168
169       entry2 = gtk_entry_new ();
170       gtk_table_attach_defaults (GTK_TABLE (table), entry2, 1, 2, 1, 2);
171       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry2);
172     }
173
174   if (!gtk_widget_get_visible (window))
175     {
176       gtk_widget_show_all (window);
177     }
178   else
179     {    
180       gtk_widget_destroy (window);
181       window = NULL;
182     }
183
184   return window;
185 }