2 * Dialog boxes for preferences for printing
4 * $Id: print_prefs.c,v 1.8 2000/10/20 04:26:40 gram Exp $
6 * Ethereal - Network traffic analyzer
7 * By Gerald Combs <gerald@zing.org>
8 * Copyright 1998 Gerald Combs
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.
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.
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.
34 #include "print_prefs.h"
37 #include "prefs_dlg.h"
40 #include "dlg_utils.h"
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);
49 #define E_FS_CALLER_PTR_KEY "fs_caller_ptr"
50 #define E_FILE_SEL_DIALOG_PTR_KEY "file_sel_dialog_ptr"
52 GtkWidget * printer_prefs_show()
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;
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
152 gtk_signal_connect(GTK_OBJECT(file_bt), "clicked",
153 GTK_SIGNAL_FUNC(printer_opts_file_cb), GTK_OBJECT(file_te));
155 gtk_widget_show(main_vb);
161 printer_opts_file_cb(GtkWidget *file_bt, gpointer file_te) {
162 GtkWidget *caller = gtk_widget_get_toplevel(file_bt);
165 /* Has a file selection dialog box already been opened for that top-level
167 fs = gtk_object_get_data(GTK_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY);
170 /* Yes. Just re-activate that dialog box. */
171 reactivate_window(fs);
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);
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);
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);
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);
189 gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION(fs)->ok_button),
190 "clicked", (GtkSignalFunc) printer_opts_fs_ok_cb, fs);
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);
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
199 dlg_set_cancel(fs, GTK_FILE_SELECTION(fs)->cancel_button);
205 printer_opts_fs_ok_cb(GtkWidget *w, gpointer data) {
207 gtk_entry_set_text(GTK_ENTRY(gtk_object_get_data(GTK_OBJECT(data),
209 gtk_file_selection_get_filename (GTK_FILE_SELECTION(data)));
210 printer_opts_fs_cancel_cb(w, data);
214 printer_opts_fs_cancel_cb(GtkWidget *w, gpointer data) {
216 gtk_widget_destroy(GTK_WIDGET(data));
220 printer_opts_fs_destroy_cb(GtkWidget *win, gpointer data)
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);
229 /* Tell it we no longer exist. */
230 gtk_object_set_data(GTK_OBJECT(caller), E_FILE_SEL_DIALOG_PTR_KEY, NULL);
232 /* Now nuke this window. */
233 gtk_grab_remove(GTK_WIDGET(win));
234 gtk_widget_destroy(GTK_WIDGET(win));
238 printer_prefs_fetch(GtkWidget *w)
241 g_free(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))));
248 g_free(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))));
256 printer_prefs_apply(GtkWidget *w)
261 printer_prefs_destroy(GtkWidget *w)
263 GtkWidget *caller = gtk_widget_get_toplevel(w);
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);
271 /* Yes. Destroy it. */
272 gtk_widget_destroy(fs);
277 printer_opts_toggle_format(GtkWidget *widget, gpointer data)
279 if (GTK_TOGGLE_BUTTON (widget)->active) {
280 prefs.pr_format = PR_FMT_PS;
281 /* toggle file/cmd */
284 prefs.pr_format = PR_FMT_TEXT;
285 /* toggle file/cmd */
290 printer_opts_toggle_dest(GtkWidget *widget, gpointer data)
292 if (GTK_TOGGLE_BUTTON (widget)->active) {
293 prefs.pr_dest = PR_DEST_FILE;
296 prefs.pr_dest = PR_DEST_CMD;