1 /* morla - Copyright (C) 2005-2007 bakunin - Andrea Marchesini
2 * <bakunin@morlardf.net>
3 *
4 * This source code is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
8 *
9 * This source code is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12 * Please refer to the GNU Public License for more details.
13 *
14 * You should have received a copy of the GNU Public License along with
15 * this source code; if not, write to:
16 * Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifdef HAVE_CONFIG_H
20 #include <config.h>
21 #else
22 # error Use configure; make; make install
23 #endif
24
25 #include "editor.h"
26
27 /* From somax */
28 gint
dialog_ask(gchar * text)29 dialog_ask (gchar * text)
30 {
31 GtkWidget *dialog;
32 GtkWidget *hbox;
33 GtkWidget *image;
34 GtkWidget *label;
35 GtkWidget *button;
36 gint ret;
37 gchar s[1024];
38
39 dialog = gtk_dialog_new ();
40 g_snprintf (s, sizeof (s), "%s %s - %s", PACKAGE, VERSION,
41 _("Question..."));
42 gtk_window_set_title (GTK_WINDOW (dialog), s);
43 gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
44 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
45 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
46 gtk_window_set_transient_for (GTK_WINDOW (dialog), main_window ());
47 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
48
49 hbox = gtk_hbox_new (FALSE, 8);
50 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE,
51 0);
52
53 image = gtk_image_new_from_stock ("gtk-dialog-info", GTK_ICON_SIZE_DIALOG);
54 gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
55
56 label = gtk_label_new (text);
57 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
58
59 button = gtk_button_new_from_stock ("gtk-no");
60 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_NO);
61
62 gtk_widget_set_can_default (button, TRUE);
63
64 button = gtk_button_new_from_stock ("gtk-ok");
65 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_OK);
66
67 gtk_widget_set_can_default (button, TRUE);
68
69 gtk_widget_show_all (dialog);
70 ret = gtk_dialog_run (GTK_DIALOG (dialog));
71 gtk_widget_destroy (dialog);
72
73 return ret;
74 }
75
76 gint
dialog_ask_with_cancel(gchar * text)77 dialog_ask_with_cancel (gchar * text)
78 {
79 GtkWidget *dialog;
80 GtkWidget *hbox;
81 GtkWidget *image;
82 GtkWidget *label;
83 GtkWidget *button;
84 gint ret;
85 gchar s[1024];
86
87 dialog = gtk_dialog_new ();
88 g_snprintf (s, sizeof (s), "%s %s - %s", PACKAGE, VERSION,
89 _("Question..."));
90 gtk_window_set_title (GTK_WINDOW (dialog), s);
91 gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
92 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
93 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
94 gtk_window_set_transient_for (GTK_WINDOW (dialog), main_window ());
95 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
96
97 hbox = gtk_hbox_new (FALSE, 8);
98 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE,
99 0);
100
101 image = gtk_image_new_from_stock ("gtk-dialog-info", GTK_ICON_SIZE_DIALOG);
102 gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
103
104 label = gtk_label_new (text);
105 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
106
107 button = gtk_button_new_from_stock ("gtk-cancel");
108 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button,
109 GTK_RESPONSE_CANCEL);
110
111 gtk_widget_set_can_default (button, TRUE);
112
113 button = gtk_button_new_from_stock ("gtk-no");
114 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_NO);
115
116 gtk_widget_set_can_default (button, TRUE);
117
118 button = gtk_button_new_from_stock ("gtk-ok");
119 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_OK);
120
121 gtk_widget_set_can_default (button, TRUE);
122
123 gtk_widget_show_all (dialog);
124 ret = gtk_dialog_run (GTK_DIALOG (dialog));
125 gtk_widget_destroy (dialog);
126
127 return ret;
128 }
129
130 void
dialog_msg(gchar * text)131 dialog_msg (gchar * text)
132 {
133 GtkWidget *dialog;
134 GtkWidget *hbox;
135 GtkWidget *image;
136 GtkWidget *label;
137 GtkWidget *button;
138 gchar s[1024];
139
140 dialog = gtk_dialog_new ();
141 g_snprintf (s, sizeof (s), "%s %s - %s", PACKAGE, VERSION,
142 _("Information..."));
143 gtk_window_set_title (GTK_WINDOW (dialog), s);
144 gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
145 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
146 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
147 gtk_window_set_transient_for (GTK_WINDOW (dialog), main_window ());
148 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
149
150 hbox = gtk_hbox_new (FALSE, 8);
151 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE,
152 0);
153
154 image = gtk_image_new_from_stock ("gtk-dialog-info", GTK_ICON_SIZE_DIALOG);
155 gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
156
157 label = gtk_label_new (text);
158 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
159
160 button = gtk_button_new_from_stock ("gtk-ok");
161 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_OK);
162
163 gtk_widget_set_can_default (button, TRUE);
164
165 gtk_widget_show_all (dialog);
166 gtk_dialog_run (GTK_DIALOG (dialog));
167 gtk_widget_destroy (dialog);
168 }
169
170 void
dialog_msg_with_error(gchar * text,gchar * error)171 dialog_msg_with_error (gchar * text, gchar * error)
172 {
173 GtkWidget *dialog;
174 GtkWidget *hbox;
175 GtkWidget *image;
176 GtkWidget *label;
177 GtkWidget *button;
178 gchar s[1024];
179
180 dialog = gtk_dialog_new ();
181 g_snprintf (s, sizeof (s), "%s %s - %s", PACKAGE, VERSION,
182 _("Information..."));
183 gtk_window_set_title (GTK_WINDOW (dialog), s);
184 gtk_window_set_type_hint (GTK_WINDOW (dialog), GDK_WINDOW_TYPE_HINT_DIALOG);
185 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
186 gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
187 gtk_window_set_transient_for (GTK_WINDOW (dialog), main_window ());
188 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
189
190 hbox = gtk_hbox_new (FALSE, 8);
191 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), hbox, TRUE, TRUE,
192 0);
193
194 image = gtk_image_new_from_stock ("gtk-dialog-info", GTK_ICON_SIZE_DIALOG);
195 gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
196
197 label = gtk_label_new (text);
198 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
199
200 /* Se c'e' l'errore mostro l'espander: */
201 if (error)
202 {
203 GtkWidget *expander;
204 GtkWidget *sw;
205 GtkWidget *textview;
206 GtkTextBuffer *buffer;
207 GtkTextIter iter;
208 gint i, j, len;
209 GtkTextTag *tag_init, *tag_error, *tag_warning;
210
211 expander = gtk_expander_new (NULL);
212 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), expander, TRUE,
213 TRUE, 0);
214
215
216 sw = gtk_scrolled_window_new (NULL, NULL);
217 gtk_container_add (GTK_CONTAINER (expander), sw);
218 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
219 GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
220
221 textview = gtk_text_view_new ();
222 gtk_container_add (GTK_CONTAINER (sw), textview);
223 gtk_widget_set_size_request (textview, -1, 200);
224 gtk_text_view_set_editable (GTK_TEXT_VIEW (textview), FALSE);
225 gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview), FALSE);
226
227 buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (textview));
228 gtk_text_buffer_get_iter_at_offset (buffer, &iter, 0);
229
230 tag_init =
231 gtk_text_buffer_create_tag (buffer, NULL, "weight", PANGO_WEIGHT_BOLD,
232 NULL);
233 tag_error =
234 gtk_text_buffer_create_tag (buffer, NULL, "foreground", "red", NULL);
235 tag_warning =
236 gtk_text_buffer_create_tag (buffer, NULL, "foreground", "blue", NULL);
237
238 for (i = j = 0, len = strlen (error); i < len; i++)
239 {
240 if (error[i] == '\n')
241 {
242 switch (*(error + j))
243 {
244 case PARSER_CHAR_INIT:
245 gtk_text_buffer_insert_with_tags (buffer, &iter,
246 error + j + 1, i - j,
247 tag_init, NULL);
248 break;
249
250 case PARSER_CHAR_WARNING:
251 gtk_text_buffer_insert_with_tags (buffer, &iter,
252 error + j + 1, i - j,
253 tag_warning, NULL);
254 break;
255
256 case PARSER_CHAR_ERROR:
257 gtk_text_buffer_insert_with_tags (buffer, &iter,
258 error + j + 1, i - j,
259 tag_error, NULL);
260 break;
261 }
262
263 j = i + 1;
264 }
265 }
266
267 label = gtk_label_new (_("Show error messages"));
268 gtk_expander_set_label_widget (GTK_EXPANDER (expander), label);
269 }
270
271 button = gtk_button_new_from_stock ("gtk-ok");
272 gtk_dialog_add_action_widget (GTK_DIALOG (dialog), button, GTK_RESPONSE_OK);
273
274 gtk_widget_set_can_default (button, TRUE);
275
276 gtk_widget_show_all (dialog);
277 gtk_dialog_run (GTK_DIALOG (dialog));
278 gtk_widget_destroy (dialog);
279 }
280
281 static void
dialog_wait_destroy(GtkWidget * window,GdkCursor * cursor)282 dialog_wait_destroy (GtkWidget * window, GdkCursor * cursor)
283 {
284 gdk_cursor_unref (cursor);
285 }
286
287 GtkWidget *
dialog_wait(GCallback callback,gpointer data,GtkWidget ** pb_ret)288 dialog_wait (GCallback callback, gpointer data, GtkWidget ** pb_ret)
289 {
290 GtkWidget *window;
291 GtkWidget *frame;
292 GtkWidget *box;
293 GtkWidget *hbox;
294 GtkWidget *image;
295 GtkWidget *pb;
296 GtkWidget *sep;
297 GtkWidget *button;
298 GtkWidget *label;
299 GdkCursor *cursor;
300 gchar s[1024];
301
302 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
303 g_snprintf (s, sizeof (s), "%s %s - %s", PACKAGE, VERSION,
304 _("Please Wait..."));
305 gtk_window_set_title (GTK_WINDOW (window), s);
306 gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER);
307 gtk_window_set_type_hint (GTK_WINDOW (window),
308 GDK_WINDOW_TYPE_HINT_SPLASHSCREEN);
309
310 gtk_window_set_modal (GTK_WINDOW (window), TRUE);
311 gtk_window_set_transient_for (GTK_WINDOW (window), main_window ());
312 gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
313 gtk_widget_set_size_request (window, 200, -1);
314
315 frame = gtk_frame_new (NULL);
316 gtk_container_add (GTK_CONTAINER (window), frame);
317
318 box = gtk_vbox_new (FALSE, 0);
319 gtk_container_add (GTK_CONTAINER (frame), box);
320
321 hbox = gtk_hbox_new (FALSE, 0);
322 gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
323
324 image = gtk_image_new_from_stock ("gtk-dialog-info", GTK_ICON_SIZE_DIALOG);
325 gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
326
327 label = gtk_label_new (_("Please Wait..."));
328 gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
329
330 pb = gtk_progress_bar_new ();
331 gtk_box_pack_start (GTK_BOX (box), pb, TRUE, TRUE, 0);
332
333 if (callback)
334 {
335 sep = gtk_hseparator_new ();
336 gtk_box_pack_start (GTK_BOX (box), sep, FALSE, FALSE, 3);
337
338 hbox = gtk_hbox_new (FALSE, 0);
339 gtk_box_pack_start (GTK_BOX (box), hbox, FALSE, FALSE, 0);
340
341 gtk_box_pack_start (GTK_BOX (hbox), gtk_hbox_new (0, 0), TRUE, TRUE, 0);
342
343 button = gtk_button_new_from_stock ("gtk-cancel");
344 gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
345 g_signal_connect (G_OBJECT (button), "clicked", callback, data);
346 }
347
348 gtk_widget_show_all (window);
349
350 cursor = gdk_cursor_new (GDK_WATCH);
351 gdk_window_set_cursor (window->window, cursor);
352
353 g_signal_connect (G_OBJECT (window), "destroy",
354 G_CALLBACK (dialog_wait_destroy), cursor);
355
356 *pb_ret = pb;
357 return window;
358 }
359
360 /* EOF */
361