Added two new arguments to epan_init() and proto_init() to
[obnox/wireshark/wip.git] / gtk / print_prefs.c
1 /* print_prefs.c
2  * Dialog boxes for preferences for printing
3  *
4  * $Id: print_prefs.c,v 1.8 2000/10/20 04:26:40 gram Exp $
5  *
6  * Ethereal - Network traffic analyzer
7  * By Gerald Combs <gerald@zing.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * 
11  * This program is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU General Public License
13  * as published by the Free Software Foundation; either version 2
14  * of the License, or (at your option) any later version.
15  * 
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  * 
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
24  */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include <errno.h>
31 #include <gtk/gtk.h>
32
33 #include "globals.h"
34 #include "print_prefs.h"
35 #include "keys.h"
36 #include "print.h"
37 #include "prefs_dlg.h"
38 #include "util.h"
39 #include "ui_util.h"
40 #include "dlg_utils.h"
41
42 static void printer_opts_file_cb(GtkWidget *w, gpointer te);
43 static void printer_opts_fs_ok_cb(GtkWidget *w, gpointer data);
44 static void printer_opts_fs_cancel_cb(GtkWidget *w, gpointer data);
45 static void printer_opts_fs_destroy_cb(GtkWidget *win, gpointer data);
46 static void printer_opts_toggle_format(GtkWidget *widget, gpointer data);
47 static void printer_opts_toggle_dest(GtkWidget *widget, gpointer data);
48
49 #define E_FS_CALLER_PTR_KEY       "fs_caller_ptr"
50 #define E_FILE_SEL_DIALOG_PTR_KEY "file_sel_dialog_ptr"
51
52 GtkWidget * printer_prefs_show()
53 {
54         GtkWidget       *main_vb, *main_tb, *button;
55         GtkWidget       *format_hb, *format_lb;
56         GtkWidget       *dest_hb, *dest_lb;
57         GtkWidget       *cmd_lb, *cmd_te;
58         GtkWidget       *file_bt_hb, *file_bt, *file_te;
59         GSList          *format_grp, *dest_grp;
60
61         /* Enclosing containers for each row of widgets */
62   main_vb = gtk_vbox_new(FALSE, 5);
63   gtk_container_border_width(GTK_CONTAINER(main_vb), 5);
64
65         main_tb = gtk_table_new(4, 2, FALSE);
66         gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0);
67   gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10);
68   gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15);
69   gtk_widget_show(main_tb);
70
71         /* Output format */
72         format_lb = gtk_label_new("Format:");
73   gtk_misc_set_alignment(GTK_MISC(format_lb), 1.0, 0.5);
74   gtk_table_attach_defaults(GTK_TABLE(main_tb), format_lb, 0, 1, 0, 1);
75         gtk_widget_show(format_lb);
76
77         format_hb = gtk_hbox_new(FALSE, 0);
78   gtk_table_attach_defaults(GTK_TABLE(main_tb), format_hb, 1, 2, 0, 1);
79         gtk_widget_show(format_hb);
80
81         button = gtk_radio_button_new_with_label(NULL, "Plain Text");
82         if (prefs.pr_format == PR_FMT_TEXT) {
83                 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), TRUE);
84         }
85         format_grp = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
86         gtk_box_pack_start(GTK_BOX(format_hb), button, FALSE, FALSE, 10);
87         gtk_widget_show(button);
88
89         button = gtk_radio_button_new_with_label(format_grp, "PostScript");
90         if (prefs.pr_format == PR_FMT_PS) {
91                 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), TRUE);
92         }
93         gtk_signal_connect(GTK_OBJECT(button), "toggled",
94                         GTK_SIGNAL_FUNC(printer_opts_toggle_format), NULL);
95         gtk_box_pack_start(GTK_BOX(format_hb), button, FALSE, FALSE, 10);
96         gtk_widget_show(button);
97
98         /* Output destination */
99         dest_lb = gtk_label_new("Print to:");
100   gtk_misc_set_alignment(GTK_MISC(dest_lb), 1.0, 0.5);
101   gtk_table_attach_defaults(GTK_TABLE(main_tb), dest_lb, 0, 1, 1, 2);
102         gtk_widget_show(dest_lb);
103
104         dest_hb = gtk_hbox_new(FALSE, 0);
105   gtk_table_attach_defaults(GTK_TABLE(main_tb), dest_hb, 1, 2, 1, 2);
106         gtk_widget_show(dest_hb);
107
108         button = gtk_radio_button_new_with_label(NULL, "Command");
109         if (prefs.pr_dest == PR_DEST_CMD) {
110                 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), TRUE);
111         }
112         dest_grp = gtk_radio_button_group(GTK_RADIO_BUTTON(button));
113         gtk_box_pack_start(GTK_BOX(dest_hb), button, FALSE, FALSE, 10);
114         gtk_widget_show(button);
115
116         button = gtk_radio_button_new_with_label(dest_grp, "File");
117         if (prefs.pr_dest == PR_DEST_FILE) {
118                 gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(button), TRUE);
119         }
120         gtk_signal_connect(GTK_OBJECT(button), "toggled",
121                         GTK_SIGNAL_FUNC(printer_opts_toggle_dest), NULL);
122         gtk_box_pack_start(GTK_BOX(dest_hb), button, FALSE, FALSE, 10);
123         gtk_widget_show(button);
124
125         /* Command text entry */
126         cmd_lb = gtk_label_new("Command:");
127   gtk_misc_set_alignment(GTK_MISC(cmd_lb), 1.0, 0.5);
128   gtk_table_attach_defaults(GTK_TABLE(main_tb), cmd_lb, 0, 1, 2, 3);
129         gtk_widget_show(cmd_lb);
130
131         cmd_te = gtk_entry_new();
132         gtk_object_set_data(GTK_OBJECT(main_vb), PRINT_CMD_TE_KEY, cmd_te);
133         if (prefs.pr_cmd) gtk_entry_set_text(GTK_ENTRY(cmd_te), prefs.pr_cmd);
134   gtk_table_attach_defaults(GTK_TABLE(main_tb), cmd_te, 1, 2, 2, 3);
135         gtk_widget_show(cmd_te);
136
137         /* File button and text entry */
138         file_bt_hb = gtk_hbox_new(FALSE, 0);
139   gtk_table_attach_defaults(GTK_TABLE(main_tb), file_bt_hb, 0, 1, 3, 4);
140         gtk_widget_show(file_bt_hb);
141
142         file_bt = gtk_button_new_with_label("File:");
143         gtk_box_pack_end(GTK_BOX(file_bt_hb), file_bt, FALSE, FALSE, 0);
144         gtk_widget_show(file_bt);
145
146         file_te = gtk_entry_new();
147         gtk_object_set_data(GTK_OBJECT(main_vb), PRINT_FILE_TE_KEY, file_te);
148         if (prefs.pr_file) gtk_entry_set_text(GTK_ENTRY(file_te), prefs.pr_file);
149   gtk_table_attach_defaults(GTK_TABLE(main_tb), file_te, 1, 2, 3, 4);
150         gtk_widget_show(file_te);
151
152         gtk_signal_connect(GTK_OBJECT(file_bt), "clicked",
153                         GTK_SIGNAL_FUNC(printer_opts_file_cb), GTK_OBJECT(file_te));
154
155         gtk_widget_show(main_vb);
156         return(main_vb);
157 }
158
159
160 static void
161 printer_opts_file_cb(GtkWidget *file_bt, gpointer file_te) {
162   GtkWidget *caller = gtk_widget_get_toplevel(file_bt);
163   GtkWidget *fs;
164
165   /* Has a file selection dialog box already been opened for that top-level
166      widget? */
167   fs = gtk_object_get_data(GTK_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY);
168
169   if (fs != NULL) {
170     /* Yes.  Just re-activate that dialog box. */
171     reactivate_window(fs);
172     return;
173   }
174
175   fs = gtk_file_selection_new ("Ethereal: Print to a File");
176         gtk_object_set_data(GTK_OBJECT(fs), PRINT_FILE_TE_KEY, file_te);
177
178   /* Set the E_FS_CALLER_PTR_KEY for the new dialog to point to our caller. */
179   gtk_object_set_data(GTK_OBJECT(fs), E_FS_CALLER_PTR_KEY, caller);
180
181   /* Set the E_FILE_SEL_DIALOG_PTR_KEY for the caller to point to us */
182   gtk_object_set_data(GTK_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY, fs);
183
184   /* Call a handler when the file selection box is destroyed, so we can inform
185      our caller, if any, that it's been destroyed. */
186   gtk_signal_connect(GTK_OBJECT(fs), "destroy",
187             GTK_SIGNAL_FUNC(printer_opts_fs_destroy_cb), NULL);
188
189   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button),
190     "clicked", (GtkSignalFunc) printer_opts_fs_ok_cb, fs);
191
192   /* Connect the cancel_button to destroy the widget */
193   gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->cancel_button),
194     "clicked", (GtkSignalFunc) printer_opts_fs_cancel_cb, fs);
195
196   /* Catch the "key_press_event" signal in the window, so that we can catch
197      the ESC key being pressed and act as if the "Cancel" button had
198      been selected. */
199   dlg_set_cancel(fs, GTK_FILE_SELECTION(fs)->cancel_button);
200
201   gtk_widget_show(fs);
202 }
203
204 static void
205 printer_opts_fs_ok_cb(GtkWidget *w, gpointer data) {
206           
207         gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(data),
208         PRINT_FILE_TE_KEY)),
209                 gtk_file_selection_get_filename (GTK_FILE_SELECTION(data)));
210         printer_opts_fs_cancel_cb(w, data);
211 }
212
213 static void
214 printer_opts_fs_cancel_cb(GtkWidget *w, gpointer data) {
215           
216         gtk_widget_destroy(GTK_WIDGET(data));
217
218
219 static void
220 printer_opts_fs_destroy_cb(GtkWidget *win, gpointer data)
221 {
222   GtkWidget *caller;
223
224   /* Get the widget that requested that we be popped up.
225      (It should arrange to destroy us if it's destroyed, so
226      that we don't get a pointer to a non-existent window here.) */
227   caller = gtk_object_get_data(GTK_OBJECT(win), E_FS_CALLER_PTR_KEY);
228
229   /* Tell it we no longer exist. */
230   gtk_object_set_data(GTK_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY, NULL);
231
232   /* Now nuke this window. */
233   gtk_grab_remove(GTK_WIDGET(win));
234   gtk_widget_destroy(GTK_WIDGET(win));
235 }
236
237 void
238 printer_prefs_fetch(GtkWidget *w)
239 {
240         if (prefs.pr_cmd)
241                 g_free(prefs.pr_cmd);
242         prefs.pr_cmd =  
243                 g_strdup(gtk_entry_get_text(
244                     GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(w),
245                       PRINT_CMD_TE_KEY))));
246
247         if (prefs.pr_file)
248                 g_free(prefs.pr_file);
249         prefs.pr_file =  
250                 g_strdup(gtk_entry_get_text(
251                     GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(w),
252                       PRINT_FILE_TE_KEY))));
253 }
254
255 void
256 printer_prefs_apply(GtkWidget *w)
257 {
258 }
259
260 void
261 printer_prefs_destroy(GtkWidget *w)
262 {
263   GtkWidget *caller = gtk_widget_get_toplevel(w);
264   GtkWidget *fs;
265
266   /* Is there a file selection dialog associated with this
267      Preferences dialog? */
268   fs = gtk_object_get_data(GTK_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY);
269
270   if (fs != NULL) {
271     /* Yes.  Destroy it. */
272     gtk_widget_destroy(fs);
273   }
274 }
275
276 static void
277 printer_opts_toggle_format(GtkWidget *widget, gpointer data)
278 {
279         if (GTK_TOGGLE_BUTTON (widget)->active) {
280                 prefs.pr_format = PR_FMT_PS;
281                 /* toggle file/cmd */
282         }
283         else {
284                 prefs.pr_format = PR_FMT_TEXT;
285                 /* toggle file/cmd */
286         }
287 }
288
289 static void
290 printer_opts_toggle_dest(GtkWidget *widget, gpointer data)
291 {
292         if (GTK_TOGGLE_BUTTON (widget)->active) {
293                 prefs.pr_dest = PR_DEST_FILE;
294         }
295         else {
296                 prefs.pr_dest = PR_DEST_CMD;
297         }
298 }