Hi,

I've made some minor improvements to the Print dialog so I thought I'd
post the patch (against CVS app/paginate_psprint.c).

Changes:

1. Fix: 317237: Print to file should suggest a better name than
output.ps
2. Prompts user if specified output file already exists.
3. Dialog stays open if there's a problem writing file or print command
(so the user can try again).

All the best,

Leon...
29a30
> #include <sys/stat.h>
336,338c337,347
<   /* Ought to use filename+extension here */
<   gtk_entry_set_text(GTK_ENTRY(ofile), "output.ps");
<   persistence_register_string_entry("printer-file", ofile);
---
> 
>   /* Work out diagram filename and use this as default .ps file */
>   char *filename = g_path_get_basename(dia->filename);
>   char *printer_filename = g_malloc(strlen(filename) + 4);
>   printer_filename = strcpy(printer_filename, filename);
>   char *dot = strrchr(printer_filename, '.');
>   if ((dot != NULL) && (strcmp(dot, ".dia") == 0))
>     *dot = '\0';
>   printer_filename = strcat(printer_filename, ".ps");
>   gtk_entry_set_text(GTK_ENTRY(ofile), printer_filename);
>   g_free(printer_filename);
346,351c355,365
<   gtk_main();
< 
<   if(!dia) {
<     gtk_widget_destroy(dialog);
<     return;
<   }
---
>   gboolean done = FALSE;
>   gboolean write_file = TRUE;	/* Used in prompt to overwrite existing file */
>   do {
>     cont = FALSE;
>     write_file = TRUE;
>     gtk_main();
> 
>     if(!dia) {
>       gtk_widget_destroy(dialog);
>       return;
>     }
353,360c367,373
<   if (!cont) {
<     persistence_change_string_entry("printer-command", orig_command, cmd);
<     persistence_change_string_entry("printer-file", orig_file, ofile);
<     gtk_widget_destroy(dialog);
<     g_free(orig_command);
<     g_free(orig_file);
<     return;
<   }
---
>     if (!cont) {
>       persistence_change_string_entry("printer-command", orig_command, cmd);
>       gtk_widget_destroy(dialog);
>       g_free(orig_command);
>       g_free(orig_file);
>       return;
>     }
362,363c375,376
<   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(iscmd))) {
<     printcmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(cmd)));
---
>     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(iscmd))) {
>       printcmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(cmd)));
365c378
<     file = win32_printer_open (printcmd);
---
>       file = win32_printer_open (printcmd);
367c380
<     file = popen(printcmd, "w");
---
>       file = popen(printcmd, "w");
369,380c382
<     is_pipe = TRUE;
<   } else {
<     const gchar *filename = gtk_entry_get_text(GTK_ENTRY(ofile));
<     if (!g_path_is_absolute(filename)) {
<       char *dirname;
<       char *full_filename;
< 
<       dirname = g_path_get_dirname(dia->filename);
<       full_filename = g_build_filename(dirname, filename, NULL);
<       file = fopen(full_filename, "w");
<       g_free(full_filename);
<       g_free(dirname);
---
>       is_pipe = TRUE;
382c384,439
<       file = fopen(filename, "w");
---
>       const gchar *filename = gtk_entry_get_text(GTK_ENTRY(ofile));
>       struct stat statbuf;
> 
>       if (stat(filename, &statbuf) == 0) {	/* Output file exists */
>         GtkWidget *confirm_overwrite_dialog = NULL;
>         char buffer[300];
>         char *utf8filename = NULL;
> 
>         if (!g_utf8_validate(filename, -1, NULL)) {
>           utf8filename = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
> 
>           if (utf8filename == NULL) {
>             message_warning(_("Some characters in the filename are neither "
> 			    "UTF-8\nnor your local encoding.\nSome things will break."));
>           }
>         }
> 
>         if (utf8filename == NULL) utf8filename = g_strdup(filename);
>         g_snprintf(buffer, 300,
>            _("The file '%s' already exists.\n"
>              "Do you want to overwrite it?"), utf8filename);
>         g_free(utf8filename);
>         confirm_overwrite_dialog = gtk_message_dialog_new(GTK_WINDOW (dialog),
>                        GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION,
>                        GTK_BUTTONS_YES_NO,
>                        buffer);
>         gtk_window_set_title(GTK_WINDOW (confirm_overwrite_dialog), 
> 	                   _("File already exists"));
>         gtk_dialog_set_default_response (GTK_DIALOG (confirm_overwrite_dialog),
> 	                   GTK_RESPONSE_NO);
> 
>         if (gtk_dialog_run(GTK_DIALOG(confirm_overwrite_dialog)) 
> 	                   != GTK_RESPONSE_YES) {
>           write_file = FALSE;
> 		  file = 0;
>         }
> 
>         gtk_widget_destroy(confirm_overwrite_dialog);
>       }
> 
> 	  if (write_file) {
>         if (!g_path_is_absolute(filename)) {
>           char *dirname;
>           char *full_filename;
> 
>           dirname = g_path_get_dirname(dia->filename);
>           full_filename = g_build_filename(dirname, filename, NULL);
>           file = fopen(full_filename, "w");
>           g_free(full_filename);
>           g_free(dirname);
>         } else {
>           file = fopen(filename, "w");
>         }
> 	  }
> 
>       is_pipe = FALSE;
384,385d440
<     is_pipe = FALSE;
<   }
387,390c442,443
<   /* Store dialog values */
<   g_free(orig_command);
<   g_free(orig_file);
<   last_print_options.printer = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(iscmd));
---
>     /* Store dialog values */
>     last_print_options.printer = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(iscmd));
392,397c445,451
<   if (!file) {
<     if (is_pipe) {
<       message_warning(_("Could not run command '%s': %s"), printcmd, strerror(errno));
<       g_free(printcmd);
<     } else
<       message_warning(_("Could not open '%s' for writing: %s"),
---
>     if (write_file) {
>       if (!file) {
>         if (is_pipe) {
>           message_warning(_("Could not run command '%s': %s"), printcmd, strerror(errno));
>           g_free(printcmd);
>         } else
>           message_warning(_("Could not open '%s' for writing: %s"),
399,401c453,456
<     gtk_widget_destroy(dialog);
<     return;
<   }
---
>       } else
>         done = TRUE;
>     }
>   } while(!done);
402a458,459
>   g_free(orig_command);
>   g_free(orig_file);
_______________________________________________
Dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://www.gnome.org/projects/dia/faq.html
Main page at http://www.gnome.org/projects/dia

Reply via email to