]> Pileus Git - ~andy/gtk/blob - demos/gtk-demo/dialog.c
It's the worlds ugliest highlighting code!!!! The result is okay so long
[~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_BUTTON_OK,
48                                         GTK_RESPONSE_OK,
49                                         NULL);
50
51   hbox = gtk_hbox_new (FALSE, 8);
52   gtk_container_set_border_width (GTK_CONTAINER (hbox), 8);
53   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, FALSE, FALSE, 0);
54
55   stock = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
56   gtk_box_pack_start (GTK_BOX (hbox), stock, FALSE, FALSE, 0);
57
58   table = gtk_table_new (2, 2, FALSE);
59   gtk_table_set_row_spacings (GTK_TABLE (table), 4);
60   gtk_table_set_col_spacings (GTK_TABLE (table), 4);
61   gtk_box_pack_start (GTK_BOX (hbox), table, TRUE, TRUE, 0);
62   label = gtk_label_new_with_mnemonic ("_Entry 1");
63   gtk_table_attach_defaults (GTK_TABLE (table),
64                              label,
65                              0, 1, 0, 1);
66   local_entry1 = gtk_entry_new ();
67   gtk_entry_set_text (GTK_ENTRY (local_entry1), gtk_entry_get_text (GTK_ENTRY (entry1)));
68   gtk_table_attach_defaults (GTK_TABLE (table), local_entry1, 1, 2, 0, 1);
69   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry1);
70
71   label = gtk_label_new_with_mnemonic ("E_ntry 2");
72   gtk_table_attach_defaults (GTK_TABLE (table),
73                              label,
74                              0, 1, 1, 2);
75
76   local_entry2 = gtk_entry_new ();
77   gtk_entry_set_text (GTK_ENTRY (local_entry2), gtk_entry_get_text (GTK_ENTRY (entry2)));
78   gtk_table_attach_defaults (GTK_TABLE (table), local_entry2, 1, 2, 1, 2);
79   gtk_label_set_mnemonic_widget (GTK_LABEL (label), local_entry2);
80   
81   gtk_widget_show_all (hbox);
82   response = gtk_dialog_run (GTK_DIALOG (dialog));
83
84   if (response == GTK_RESPONSE_OK)
85     {
86       gtk_entry_set_text (GTK_ENTRY (entry1), gtk_entry_get_text (GTK_ENTRY (local_entry1)));
87       gtk_entry_set_text (GTK_ENTRY (entry2), gtk_entry_get_text (GTK_ENTRY (local_entry2)));
88     }
89
90   gtk_widget_destroy (dialog);
91 }
92
93 GtkWidget *
94 do_dialog (void)
95 {
96   GtkWidget *frame;
97   GtkWidget *vbox;
98   GtkWidget *vbox2;
99   GtkWidget *hbox;
100   GtkWidget *button;
101   GtkWidget *table;
102   GtkWidget *label;
103   
104   if (!window)
105     {
106       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
107       gtk_window_set_title (GTK_WINDOW (window), "Dialogs");
108
109       gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
110       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
111
112       frame = gtk_frame_new ("Dialogs");
113       gtk_container_add (GTK_CONTAINER (window), frame);
114
115       vbox = gtk_vbox_new (FALSE, 8);
116       gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
117       gtk_container_add (GTK_CONTAINER (frame), vbox);
118
119       /* Standard message dialog */
120       hbox = gtk_hbox_new (FALSE, 8);
121       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
122       button = gtk_button_new_with_mnemonic ("_Message Dialog");
123       gtk_signal_connect (GTK_OBJECT (button), "clicked",
124                           GTK_SIGNAL_FUNC (message_dialog_clicked), NULL);
125       gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
126
127       gtk_box_pack_start (GTK_BOX (vbox), gtk_hseparator_new (), FALSE, FALSE, 0);
128
129       /* Interactive dialog*/
130       hbox = gtk_hbox_new (FALSE, 8);
131       gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
132       vbox2 = gtk_vbox_new (FALSE, 0);
133
134       button = gtk_button_new_with_mnemonic ("_Interactive Dialog");
135       gtk_signal_connect (GTK_OBJECT (button), "clicked",
136                           GTK_SIGNAL_FUNC (interactive_dialog_clicked), NULL);
137       gtk_box_pack_start (GTK_BOX (hbox), vbox2, FALSE, FALSE, 0);
138       gtk_box_pack_start (GTK_BOX (vbox2), button, FALSE, FALSE, 0);
139
140       table = gtk_table_new (2, 2, FALSE);
141       gtk_table_set_row_spacings (GTK_TABLE (table), 4);
142       gtk_table_set_col_spacings (GTK_TABLE (table), 4);
143       gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
144
145       label = gtk_label_new_with_mnemonic ("_Entry 1");
146       gtk_table_attach_defaults (GTK_TABLE (table),
147                                  label,
148                                  0, 1, 0, 1);
149
150       entry1 = gtk_entry_new ();
151       gtk_table_attach_defaults (GTK_TABLE (table), entry1, 1, 2, 0, 1);
152       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry1);
153
154       label = gtk_label_new_with_mnemonic ("E_ntry 2");
155       
156       gtk_table_attach_defaults (GTK_TABLE (table),
157                                  label,
158                                  0, 1, 1, 2);
159
160       entry2 = gtk_entry_new ();
161       gtk_table_attach_defaults (GTK_TABLE (table), entry2, 1, 2, 1, 2);
162       gtk_label_set_mnemonic_widget (GTK_LABEL (label), entry2);
163     }
164
165   if (!GTK_WIDGET_VISIBLE (window))
166     {
167       gtk_widget_show_all (window);
168     }
169   else
170     {    
171       gtk_widget_destroy (window);
172       window = NULL;
173     }
174
175   return window;
176 }