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