]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/dialog.c
add demo of passing non-stock label in to gtk_dialog_new_with_buttons
[~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:\n\n"
25                                    "%d", i);
26   gtk_dialog_run (GTK_DIALOG (dialog));
27   gtk_widget_destroy (dialog);
28   i++;
29 }
30
31 static void
32 interactive_dialog_clicked (GtkButton *button,
33                             gpointer   user_data)
34 {
35   GtkWidget *dialog;
36   GtkWidget *hbox;
37   GtkWidget *stock;
38   GtkWidget *table;
39   GtkWidget *local_entry1;
40   GtkWidget *local_entry2;
41   GtkWidget *label;
42   gint response;
43
44   dialog = gtk_dialog_new_with_buttons ("Interactive Dialog",
45                                         GTK_WINDOW (window),
46                                         GTK_DIALOG_MODAL| GTK_DIALOG_DESTROY_WITH_PARENT,
47                                         GTK_STOCK_OK,
48                                         GTK_RESPONSE_OK,
49                                         "_Non-stock Button",
50                                         GTK_RESPONSE_CANCEL,
51                                         NULL);
52
53   hbox = gtk_hbox_new (FALSE, 8);
54   gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
55   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);
56
57   stock = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
58   gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
59
60   table = gtk_table_new (2, 2, FALSE);
61   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
62   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
63   gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
64   label = gtk_label_new_with_mnemonic ("_Entry 1");
65   gtk_table_attach_defaults (GTK_TABLE (table),
66                              label,
67                              0, 1, 0, 1);
68   local_entry1 = gtk_entry_new ();
69   gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (entry1)));
70   gtk_table_attach_defaults (GTK_TABLE (table), local_entry1, 1, 2, 0, 1);
71   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry1);
72
73   label = gtk_label_new_with_mnemonic ("E_ntry 2");
74   gtk_table_attach_defaults (GTK_TABLE (table),
75                              label,
76                              0, 1, 1, 2);
77
78   local_entry2 = gtk_entry_new ();
79   gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (entry2)));
80   gtk_table_attach_defaults (GTK_TABLE (table), local_entry2, 1, 2, 1, 2);
81   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
82   
83   gtk_widget_show_all (hbox);
84   response = gtk_dialog_run (GTK_DIALOG (dialog));
85
86   if (response == GTK_RESPONSE_OK)
87     {
88       gtk_entry_set_text (GTK_ENTRY (entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
89       gtk_entry_set_text (GTK_ENTRY (entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
90     }
91
92   gtk_widget_destroy (dialog);
93 }
94
95 GtkWidget *
96 do_dialog (void)
97 {
98   GtkWidget *frame;
99   GtkWidget *vbox;
100   GtkWidget *vbox2;
101   GtkWidget *hbox;
102   GtkWidget *button;
103   GtkWidget *table;
104   GtkWidget *label;
105   
106   if (!window)
107     {
108       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
109       gtk_window_set_title (GTK_WINDOW (window), "Dialogs");
110
111       gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
112       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
113
114       frame = gtk_frame_new ("Dialogs");
115       gtk_container_add (GTK_CONTAINER (window), frame);
116
117       vbox = gtk_vbox_new (FALSE, 8);
118       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
119       gtk_container_add (GTK_CONTAINER (frame), vbox);
120
121       /* Standard message dialog */
122       hbox = gtk_hbox_new (FALSE, 8);
123       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
124       button = gtk_button_new_with_mnemonic ("_Message Dialog");
125       gtk_signal_connect (GTK_OBJECT (button), "clicked",
126                           GTK_SIGNAL_FUNC (message_dialog_clicked), NULL);
127       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
128
129       gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
130
131       /* Interactive dialog*/
132       hbox = gtk_hbox_new (FALSE, 8);
133       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
134       vbox2 = gtk_vbox_new (FALSE, 0);
135
136       button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
137       gtk_signal_connect (GTK_OBJECT (button), "clicked",
138                           GTK_SIGNAL_FUNC (interactive_dialog_clicked), NULL);
139       gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
140       gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
141
142       table = gtk_table_new (2, 2, FALSE);
143       gtk_table_set_row_spacings (GTK_TABLE (table), 4);
144       gtk_table_set_col_spacings (GTK_TABLE (table), 4);
145       gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
146
147       label = gtk_label_new_with_mnemonic ("_Entry 1");
148       gtk_table_attach_defaults (GTK_TABLE (table),
149                                  label,
150                                  0, 1, 0, 1);
151
152       entry1 = gtk_entry_new ();
153       gtk_table_attach_defaults (GTK_TABLE (table), entry1, 1, 2, 0, 1);
154       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry1);
155
156       label = gtk_label_new_with_mnemonic ("E_ntry 2");
157       
158       gtk_table_attach_defaults (GTK_TABLE (table),
159                                  label,
160                                  0, 1, 1, 2);
161
162       entry2 = gtk_entry_new ();
163       gtk_table_attach_defaults (GTK_TABLE (table), entry2, 1, 2, 1, 2);
164       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry2);
165     }
166
167   if (!GTK_WIDGET_VISIBLE (window))
168     {
169       gtk_widget_show_all (window);
170     }
171   else
172     {    
173       gtk_widget_destroy (window);
174       window = NULL;
175     }
176
177   return window;
178 }