29035d2be54109befbe03a7353bd10b55ca65b9d
[geeqie.git] / src / utildlg.c
1 /*
2  * GQview image viewer
3  * (C)1999 John Ellis
4  *
5  * Author: John Ellis
6  *
7  */
8
9 #include "gqview.h"
10
11 static void warning_dialog_close(GtkWidget *w, gpointer data);
12 static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data);
13
14 static void confirm_dialog_click_cb(GtkWidget *w, gpointer data);
15 static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data);
16
17 static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data);
18
19
20 /*
21  *-----------------------------------------------------------------------------
22  * warning dialog routines
23  *-----------------------------------------------------------------------------
24  */ 
25
26 static void warning_dialog_close(GtkWidget *w, gpointer data)
27 {
28         GtkWidget *warning_window = data;
29         gtk_widget_destroy(warning_window);
30 }
31
32 static void warning_dialog_destroy(GtkWidget *w, GdkEvent *event, gpointer data)
33 {
34         warning_dialog_close(NULL, data);
35 }
36
37 void warning_dialog(gchar *title, gchar *message)
38 {
39         GtkWidget *warning_window;
40         GtkWidget *hbox;
41         GtkWidget *vbox;
42         GtkWidget *label;
43         GtkWidget *button;
44
45         warning_window = gtk_window_new(GTK_WINDOW_DIALOG);
46         gtk_signal_connect (GTK_OBJECT (warning_window), "delete_event",(GtkSignalFunc) warning_dialog_destroy, warning_window);
47         gtk_window_set_policy (GTK_WINDOW(warning_window), FALSE, FALSE, TRUE);
48         gtk_window_set_title (GTK_WINDOW (warning_window), title);
49         gtk_container_border_width (GTK_CONTAINER (warning_window), 10);
50
51         vbox = gtk_vbox_new(FALSE, 5);
52         gtk_container_add(GTK_CONTAINER(warning_window),vbox);
53         gtk_widget_show(vbox);
54
55         label = gtk_label_new(message);
56         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
57         gtk_widget_show(label);
58
59         label = gtk_hseparator_new();
60         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
61         gtk_widget_show(label);
62
63         hbox = gtk_hbox_new(TRUE, 5);
64         gtk_container_add(GTK_CONTAINER(vbox),hbox);
65         gtk_widget_show(hbox);
66
67         button = gtk_button_new_with_label(_("     Ok     "));
68         gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) warning_dialog_close, warning_window);
69         gtk_box_pack_start(GTK_BOX(hbox),button,FALSE,FALSE,0);
70         gtk_widget_show(button);
71         
72         gtk_widget_show(warning_window);
73 }
74
75 /*
76  *-----------------------------------------------------------------------------
77  * confirmation dialog
78  *-----------------------------------------------------------------------------
79  */ 
80
81 static void confirm_dialog_click_cb(GtkWidget *w, gpointer data)
82 {
83         ConfirmDialog *cd = data;
84         gtk_widget_destroy(cd->dialog);
85         g_free(cd);
86 }
87
88 static void confirm_dialog_delete_cb(GtkWidget *w, GdkEvent *event, gpointer data)
89 {
90         ConfirmDialog *cd = data;
91         cd->cancel_cb(NULL, cd->data);
92         confirm_dialog_click_cb(w, data);
93 }
94
95 void confirm_dialog_add(ConfirmDialog *cd, gchar *text, void (*func_cb)(GtkWidget *, gpointer))
96 {
97         GtkWidget *button;
98         button = gtk_button_new_with_label(text);
99         gtk_signal_connect(GTK_OBJECT(button), "clicked", func_cb, cd->data);
100         gtk_signal_connect(GTK_OBJECT(button), "clicked", confirm_dialog_click_cb, cd);
101         gtk_box_pack_end(GTK_BOX(cd->hbox), button, TRUE, TRUE, 0);
102         gtk_widget_grab_focus(button);
103         gtk_widget_show(button);
104 }
105
106 ConfirmDialog *confirm_dialog_new(gchar *title, gchar *message, void (*cancel_cb)(GtkWidget *, gpointer), gpointer data)
107 {
108         ConfirmDialog *cd;
109         GtkWidget *vbox;
110         GtkWidget *label;
111
112         cd = g_new0(ConfirmDialog, 1);
113         cd->data = data;
114         cd->cancel_cb = cancel_cb;
115
116         cd->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
117         gtk_signal_connect (GTK_OBJECT (cd->dialog), "delete_event", confirm_dialog_delete_cb, cd);
118         gtk_window_set_policy (GTK_WINDOW(cd->dialog), FALSE, FALSE, TRUE);
119         gtk_window_set_title (GTK_WINDOW (cd->dialog), title);
120         gtk_container_border_width (GTK_CONTAINER (cd->dialog), 10);
121
122         vbox = gtk_vbox_new(FALSE, 15);
123         gtk_container_add(GTK_CONTAINER(cd->dialog),vbox);
124         gtk_widget_show(vbox);
125
126         label = gtk_label_new(message);
127         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
128         gtk_widget_show(label);
129
130         label = gtk_hseparator_new();
131         gtk_box_pack_start(GTK_BOX(vbox),label,FALSE,FALSE,0);
132         gtk_widget_show(label);
133
134         cd->hbox = gtk_hbox_new(TRUE, 15);
135         gtk_container_add(GTK_CONTAINER(vbox),cd->hbox);
136         gtk_widget_show(cd->hbox);
137
138         gtk_widget_show(cd->dialog);
139
140         confirm_dialog_add(cd, _("Cancel"), cd->cancel_cb);
141         
142         return cd;
143 }
144
145 /*
146  *-----------------------------------------------------------------------------
147  * generic file ops dialog routines
148  *-----------------------------------------------------------------------------
149  */ 
150
151 void generic_dialog_close(GtkWidget *widget, gpointer data)
152 {
153         FileDialog *fd = data;
154         if(fd->dialog) gtk_widget_destroy(fd->dialog);
155         g_free(fd->source_path);
156         g_free(fd->dest_path);
157         if (fd->source_list) free_selected_list(fd->source_list);
158         g_free(fd);
159 }
160
161 static void generic_dialog_delete_cb(GtkWidget *widget, GdkEvent *event, gpointer data)
162 {
163         generic_dialog_close(NULL, data);
164 }
165
166 FileDialog *generic_dialog_new(gchar *title, gchar *text, gchar *btn1, gchar *btn2,
167                 void (*btn1_cb)(GtkWidget *, gpointer),
168                 void (*btn2_cb)(GtkWidget *, gpointer))
169 {
170         FileDialog *fd = NULL;
171         GtkWidget *button;
172         GtkWidget *hbox;
173         GtkWidget *label;
174
175         fd = g_new0(FileDialog, 1);
176
177         fd->dialog = gtk_window_new(GTK_WINDOW_DIALOG);
178         gtk_signal_connect (GTK_OBJECT (fd->dialog), "delete_event", (GtkSignalFunc)generic_dialog_delete_cb, fd);
179         gtk_window_set_policy (GTK_WINDOW(fd->dialog), FALSE, TRUE, FALSE);
180         gtk_window_set_title (GTK_WINDOW (fd->dialog), title);
181         gtk_container_border_width (GTK_CONTAINER (fd->dialog), 10);
182
183         fd->vbox = gtk_vbox_new(FALSE,5);
184         gtk_container_add (GTK_CONTAINER(fd->dialog), fd->vbox);
185         gtk_widget_show(fd->vbox);
186
187         if (text)
188                 {
189                 label = gtk_label_new(text);
190                 gtk_box_pack_start(GTK_BOX(fd->vbox), label, FALSE, FALSE, 0);
191                 gtk_widget_show(label);
192                 }
193         
194         if (btn1_cb || btn2_cb)
195                 {
196                 GtkWidget *sep;
197                 hbox = gtk_hbox_new(TRUE, 15);
198                 gtk_box_pack_end(GTK_BOX(fd->vbox), hbox, FALSE, FALSE, 5);
199                 gtk_widget_show(hbox);
200
201                 sep = gtk_hseparator_new();
202                 gtk_box_pack_end(GTK_BOX(fd->vbox), sep, FALSE, FALSE, 0);
203                 gtk_widget_show(sep);
204                 }
205
206         if (btn1_cb)
207                 {
208                 button = gtk_button_new_with_label(btn1);
209                 gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn1_cb, fd);
210                 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
211                 gtk_widget_grab_focus(button);
212                 gtk_widget_show(button);
213                 }
214
215         if (btn2_cb)
216                 {
217                 button = gtk_button_new_with_label(btn2);
218                 gtk_signal_connect (GTK_OBJECT (button), "clicked",(GtkSignalFunc) btn2_cb, fd);
219                 gtk_box_pack_start(GTK_BOX(hbox), button, TRUE, TRUE, 0);
220                 gtk_widget_show(button);
221                 }
222
223         gtk_widget_show(fd->dialog);
224         return fd;
225 }
226