From 9e19da0f2ad5fe82c24ae82c281786b64d0156d5 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 16 Oct 2010 18:11:27 +0000 Subject: [PATCH] Improve wxGTK print and page setup dialogs. Handle more fields (notably collation, number of copies and "print to file" flag) and fix the bug with return value of print dialog ShowModal(). Closes #12499. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65830 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + src/gtk/print.cpp | 102 +++++++++++++++++++++++++++++++++------------- 2 files changed, 74 insertions(+), 29 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 8d0d252577..dff8589114 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -417,6 +417,7 @@ All (GUI): - Added EVT_RIBBONBAR_TAB_LEFT_DCLICK event (snowleopard). - Fix display of right aligned columns in wxGenericListCtrl (jl). - Restore text drag-and-drop in wxSTC broken by Scintilla 2 update (Jens Lody). +- Improve wxGTK print/page setup dialog (rafravago). MSW: diff --git a/src/gtk/print.cpp b/src/gtk/print.cpp index c2310236d3..2c3376d044 100644 --- a/src/gtk/print.cpp +++ b/src/gtk/print.cpp @@ -36,6 +36,7 @@ #include "wx/paper.h" #include +#include #if wxUSE_GRAPHICS_CONTEXT #include "wx/graphics.h" @@ -48,6 +49,8 @@ wxFORCE_LINK_THIS_MODULE(gtk_print) #include "wx/gtk/gnome/gprint.h" #endif +#include "wx/gtk/private/object.h" + // Usefull to convert angles from/to Rad to/from Deg. static const double RAD2DEG = 180.0 / M_PI; static const double DEG2RAD = M_PI / 180.0; @@ -668,6 +671,12 @@ int wxGtkPrintDialog::ShowModal() native->SetPrintConfig(newSettings); data.ConvertFromNative(); + // Set PrintDialogData variables + m_printDialogData.SetPrintData(data); + m_printDialogData.SetCollate(data.GetCollate()); + m_printDialogData.SetNoCopies(data.GetNoCopies()); + m_printDialogData.SetPrintToFile(data.GetPrinterName() == "Print to File"); + // Same problem as a few lines before. switch (gtk_print_settings_get_print_pages(newSettings)) { @@ -745,43 +754,78 @@ int wxGtkPageSetupDialog::ShowModal() } } - // Now show the dialog. - GtkPageSetup* newPageSetup = gtk_print_run_page_setup_dialog (GTK_WINDOW(m_parent->m_widget), - oldPageSetup, - nativeData); - int ret; - if (newPageSetup != oldPageSetup) - { - native->SetPageSetupToSettings(nativeData, newPageSetup); - m_pageDialogData.GetPrintData().ConvertFromNative(); + // Set selected printer + gtk_print_settings_set(nativeData, "format-for-printer", + gtk_print_settings_get_printer(nativeData)); - // Store custom paper format if any. - if (m_pageDialogData.GetPrintData().GetPaperId() == wxPAPER_NONE) - { - gdouble ml,mr,mt,mb,pw,ph; - ml = gtk_page_setup_get_left_margin (newPageSetup, GTK_UNIT_MM); - mr = gtk_page_setup_get_right_margin (newPageSetup, GTK_UNIT_MM); - mt = gtk_page_setup_get_top_margin (newPageSetup, GTK_UNIT_MM); - mb = gtk_page_setup_get_bottom_margin (newPageSetup, GTK_UNIT_MM); + // Create custom dialog + wxString title(GetTitle()); + if ( title.empty() ) + title = _("Page Setup"); + GtkWidget *dlg = gtk_page_setup_unix_dialog_new(title, GTK_WINDOW(m_parent->m_widget)); - pw = gtk_page_setup_get_paper_width (newPageSetup, GTK_UNIT_MM); - ph = gtk_page_setup_get_paper_height (newPageSetup, GTK_UNIT_MM); + gtk_page_setup_unix_dialog_set_print_settings( + GTK_PAGE_SETUP_UNIX_DIALOG(dlg), nativeData); + gtk_page_setup_unix_dialog_set_page_setup( + GTK_PAGE_SETUP_UNIX_DIALOG(dlg), oldPageSetup); - m_pageDialogData.SetMarginTopLeft( wxPoint( (int)(ml+0.5), (int)(mt+0.5)) ); - m_pageDialogData.SetMarginBottomRight( wxPoint( (int)(mr+0.5), (int)(mb+0.5)) ); + int result = gtk_dialog_run(GTK_DIALOG(dlg)); + gtk_widget_hide(dlg); - m_pageDialogData.SetPaperSize( wxSize( (int)(pw+0.5), (int)(ph+0.5) ) ); - } - - ret = wxID_OK; - } - else + switch ( result ) { - ret = wxID_CANCEL; + case GTK_RESPONSE_OK: + case GTK_RESPONSE_APPLY: + { + // Store Selected Printer Name + gtk_print_settings_set_printer + ( + nativeData, + gtk_print_settings_get(nativeData, "format-for-printer") + ); + + wxGtkObject + newPageSetup(gtk_page_setup_unix_dialog_get_page_setup( + GTK_PAGE_SETUP_UNIX_DIALOG(dlg))); + native->SetPageSetupToSettings(nativeData, newPageSetup); + + m_pageDialogData.GetPrintData().ConvertFromNative(); + + // Store custom paper format if any. + if ( m_pageDialogData.GetPrintData().GetPaperId() == wxPAPER_NONE ) + { + gdouble ml,mr,mt,mb,pw,ph; + ml = gtk_page_setup_get_left_margin (newPageSetup, GTK_UNIT_MM); + mr = gtk_page_setup_get_right_margin (newPageSetup, GTK_UNIT_MM); + mt = gtk_page_setup_get_top_margin (newPageSetup, GTK_UNIT_MM); + mb = gtk_page_setup_get_bottom_margin (newPageSetup, GTK_UNIT_MM); + + pw = gtk_page_setup_get_paper_width (newPageSetup, GTK_UNIT_MM); + ph = gtk_page_setup_get_paper_height (newPageSetup, GTK_UNIT_MM); + + m_pageDialogData.SetMarginTopLeft(wxPoint((int)(ml+0.5), + (int)(mt+0.5))); + m_pageDialogData.SetMarginBottomRight(wxPoint((int)(mr+0.5), + (int)(mb+0.5))); + + m_pageDialogData.SetPaperSize(wxSize((int)(pw+0.5), + (int)(ph+0.5))); + } + + result = wxID_OK; + } + break; + + default: + case GTK_RESPONSE_CANCEL: + result = wxID_CANCEL; + break; } - return ret; + gtk_widget_destroy(dlg); + + return result; } //---------------------------------------------------------------------------- -- 2.45.2