From d2b354f9c9f1473b2d6ff0ab643ebf57dcbfb656 Mon Sep 17 00:00:00 2001 From: Julian Smart Date: Wed, 23 Jul 2003 20:30:19 +0000 Subject: [PATCH] Printing improvements: GetPageInfo() gets called after the DC has been set and after OnPreparePrinting() has been called so it can report the number of pages accurately; doesn't try to set number of pages in print dialog, in common with other Windows apps; wxHTML easy printing's preview shows number of pages correctly; preview scrollbars are set correctly; keyboard navigation improved git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@22263 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 7 +++ docs/latex/wx/print.tex | 6 +- docs/todo30.txt | 2 + include/wx/html/htmprint.h | 1 + include/wx/prntbase.h | 22 +++++--- src/common/cmndata.cpp | 8 +-- src/common/prntbase.cpp | 108 +++++++++++++++++++++++++----------- src/generic/printps.cpp | 23 ++++++++ src/html/htmprint.cpp | 14 +++-- src/mac/carbon/printmac.cpp | 55 ++++++++---------- src/mac/printmac.cpp | 55 ++++++++---------- src/msw/printwin.cpp | 59 +++++++------------- 12 files changed, 205 insertions(+), 155 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 33bcd14090..d3b9ad8063 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -126,6 +126,13 @@ All GUI ports: - send menu update events only when a menu is about to be used (MSW/GTK) - improved event processing performance (Hans Van Leemputten) - added wxMirrorDC class +- printing improvements: GetPageInfo() gets called after the DC has + been set and after OnPreparePrinting() has been called so it can + report the number of pages accurately; doesn't try to set + number of pages in print dialog, in common with other Windows apps; + wxHTML easy printing's preview shows number of pages + correctly; preview scrollbars are set correctly; keyboard navigation + improved Unix: diff --git a/docs/latex/wx/print.tex b/docs/latex/wx/print.tex index c35a1f935f..e87acae4b5 100644 --- a/docs/latex/wx/print.tex +++ b/docs/latex/wx/print.tex @@ -786,7 +786,7 @@ reference) and to return a tuple of four integers. } \perlnote{When this method is overridden in a derived class, -it must not take any parameters, an return a 4-element list. +it must not take any parameters, and returns a 4-element list. } \membersection{wxPrintout::GetPageSizeMM}\label{wxprintoutgetpagesizemm} @@ -981,7 +981,7 @@ internally. \membersection{wxPrintPreview::GetCanvas}\label{wxprintpreviewgetcanvas} -\func{wxWindow* }{GetCanvas}{\void} +\func{wxPreviewCanvas* }{GetCanvas}{\void} Gets the preview window used for displaying the print preview image. @@ -1067,7 +1067,7 @@ Renders a page into a wxMemoryDC. Used internally by wxPrintPreview. \membersection{wxPrintPreview::SetCanvas}\label{wxprintpreviewsetcanvas} -\func{void}{SetCanvas}{\param{wxWindow* }{window}} +\func{void}{SetCanvas}{\param{wxPreviewCanvas** }{window}} Sets the window to be used for displaying the print preview image. diff --git a/docs/todo30.txt b/docs/todo30.txt index 008b93a19e..8f7e1b91f4 100644 --- a/docs/todo30.txt +++ b/docs/todo30.txt @@ -179,6 +179,8 @@ wxMiscellaneous has been destroyed or recreated. On wxMSW, this is done in ~wxToolBar. On wxGTK, in SetToolBar. In wxMac, not at all, but sending a wxSizeEvent will do it. +- Need wxRect wxToolBar::GetToolRect(int id) or similar so we can + align a popup menu with a toolbar button. - wxMac font selector dialog is the generic font selector - horrible. - No Append(wxArrayString&) for wxChoice and wxComboBox in wxGTK. diff --git a/include/wx/html/htmprint.h b/include/wx/html/htmprint.h index 4cb723c388..5b7c72db7b 100644 --- a/include/wx/html/htmprint.h +++ b/include/wx/html/htmprint.h @@ -152,6 +152,7 @@ public: bool HasPage(int page); void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); bool OnBeginDocument(int startPage, int endPage); + void OnPreparePrinting(); // Adds input filter static void AddFilter(wxHtmlFilter *filter); diff --git a/include/wx/prntbase.h b/include/wx/prntbase.h index 2f3c3726fa..42e04bf85f 100644 --- a/include/wx/prntbase.h +++ b/include/wx/prntbase.h @@ -171,6 +171,7 @@ public: ~wxPreviewCanvas(); void OnPaint(wxPaintEvent& event); + void OnChar(wxKeyEvent &event); // Responds to colour changes void OnSysColourChanged(wxSysColourChangedEvent& event); @@ -204,8 +205,11 @@ public: virtual void Initialize(); virtual void CreateCanvas(); virtual void CreateControlBar(); + + inline wxPreviewControlBar* GetControlBar() const { return m_controlBar; } + protected: - wxWindow* m_previewCanvas; + wxPreviewCanvas* m_previewCanvas; wxPreviewControlBar* m_controlBar; wxPrintPreviewBase* m_printPreview; @@ -253,7 +257,7 @@ public: wxWindow *parent, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, - long style = 0, + long style = wxTAB_TRAVERSAL, const wxString& name = wxT("panel")); ~wxPreviewControlBar(); @@ -275,7 +279,6 @@ public: void OnFirstButton(wxCommandEvent & WXUNUSED(event)) { OnFirst(); } void OnLastButton(wxCommandEvent & WXUNUSED(event)) { OnLast(); } void OnGotoButton(wxCommandEvent & WXUNUSED(event)) { OnGoto(); } - void OnChar(wxKeyEvent &event); void OnZoom(wxCommandEvent& event); void OnPaint(wxPaintEvent& event); @@ -322,16 +325,19 @@ public: wxPrintout *GetPrintoutForPrinting() const { return m_printPrintout; }; void SetFrame(wxFrame *frame) { m_previewFrame = frame; }; - void SetCanvas(wxWindow *canvas) { m_previewCanvas = canvas; }; + void SetCanvas(wxPreviewCanvas *canvas) { m_previewCanvas = canvas; }; virtual wxFrame *GetFrame() const { return m_previewFrame; } - virtual wxWindow *GetCanvas() const { return m_previewCanvas; } + virtual wxPreviewCanvas *GetCanvas() const { return m_previewCanvas; } // The preview canvas should call this from OnPaint - virtual bool PaintPage(wxWindow *canvas, wxDC& dc); + virtual bool PaintPage(wxPreviewCanvas *canvas, wxDC& dc); // This draws a blank page onto the preview canvas - virtual bool DrawBlankPage(wxWindow *canvas, wxDC& dc); + virtual bool DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc); + + // Adjusts the scrollbars for the current scale + virtual void AdjustScrollbars(wxPreviewCanvas *canvas); // This is called by wxPrintPreview to render a page into a wxMemoryDC. virtual bool RenderPage(int pageNum); @@ -362,7 +368,7 @@ public: protected: wxPrintDialogData m_printDialogData; - wxWindow* m_previewCanvas; + wxPreviewCanvas* m_previewCanvas; wxFrame* m_previewFrame; wxBitmap* m_previewBitmap; wxPrintout* m_previewPrintout; diff --git a/src/common/cmndata.cpp b/src/common/cmndata.cpp index f9ecd46ff9..157e32eb14 100644 --- a/src/common/cmndata.cpp +++ b/src/common/cmndata.cpp @@ -776,10 +776,10 @@ wxPrintDialogData::wxPrintDialogData(const wxPrintData& printData) #ifdef __WXMSW__ m_printDlgData = NULL; #endif - m_printFromPage = 0; + m_printFromPage = 1; m_printToPage = 0; - m_printMinPage = 0; - m_printMaxPage = 0; + m_printMinPage = 1; + m_printMaxPage = 9999; m_printNoCopies = 1; m_printAllPages = FALSE; m_printCollate = FALSE; @@ -897,7 +897,7 @@ void wxPrintDialogData::ConvertToNative() pd->Flags |= PD_NOSELECTION; if ( !m_printEnablePageNumbers ) pd->Flags |= PD_NOPAGENUMS; - else if ( (!m_printAllPages) && (!m_printSelection) ) + else if ( (!m_printAllPages) && (!m_printSelection) && (m_printFromPage != 0) && (m_printToPage != 0)) pd->Flags |= PD_PAGENUMS; if ( m_printEnableHelp ) pd->Flags |= PD_SHOWHELP; diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index 4f5860323f..ee3ec90dad 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -70,6 +70,7 @@ END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow) EVT_PAINT(wxPreviewCanvas::OnPaint) + EVT_CHAR(wxPreviewCanvas::OnChar) EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged) END_EVENT_TABLE() @@ -197,7 +198,7 @@ wxScrolledWindow(parent, -1, pos, size, style, name) #endif SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); - SetScrollbars(15, 18, 100, 100); + SetScrollbars(10, 10, 100, 100); } wxPreviewCanvas::~wxPreviewCanvas() @@ -239,6 +240,38 @@ void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) wxWindow::OnSysColourChanged(event); } +void wxPreviewCanvas::OnChar(wxKeyEvent &event) +{ + if (event.GetKeyCode() == WXK_ESCAPE) + { + ((wxPreviewFrame*) GetParent())->Close(TRUE); + return; + } + + if (!event.ControlDown()) + { + event.Skip(); + return; + } + + wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar(); + switch(event.GetKeyCode()) + { + case WXK_NEXT: + controlBar->OnNext(); break; + case WXK_PRIOR: + controlBar->OnPrevious(); break; + case WXK_HOME: + controlBar->OnFirst(); break; + case WXK_END: + controlBar->OnLast(); break; + case WXK_TAB: + controlBar->OnGoto(); break; + default: + event.Skip(); + } +} + /* * Preview control bar */ @@ -251,7 +284,6 @@ BEGIN_EVENT_TABLE(wxPreviewControlBar, wxPanel) EVT_BUTTON(wxID_PREVIEW_FIRST, wxPreviewControlBar::OnFirstButton) EVT_BUTTON(wxID_PREVIEW_LAST, wxPreviewControlBar::OnLastButton) EVT_BUTTON(wxID_PREVIEW_GOTO, wxPreviewControlBar::OnGotoButton) - EVT_CHAR(wxPreviewControlBar::OnChar) EVT_CHOICE(wxID_PREVIEW_ZOOM, wxPreviewControlBar::OnZoom) EVT_PAINT(wxPreviewControlBar::OnPaint) END_EVENT_TABLE() @@ -297,25 +329,6 @@ void wxPreviewControlBar::OnPrint(wxCommandEvent& WXUNUSED(event)) preview->Print(TRUE); } -void wxPreviewControlBar::OnChar(wxKeyEvent &event) -{ - switch(event.GetKeyCode()) - { - case WXK_NEXT: - OnNext(); break; - case WXK_PRIOR: - OnPrevious(); break; - case WXK_HOME: - OnFirst(); break; - case WXK_END: - OnLast(); break; - case WXK_TAB: - OnGoto(); break; - default: - event.Skip(); - } -} - void wxPreviewControlBar::OnNext(void) { wxPrintPreviewBase *preview = GetPrintPreview(); @@ -384,12 +397,12 @@ void wxPreviewControlBar::OnGoto(void) wxString strPrompt; wxString strPage; - strPrompt.Printf( wxT("%d...%d"), + strPrompt.Printf( _("Enter a page number between %d and %d:"), preview->GetMinPage(), preview->GetMaxPage()); strPage.Printf( wxT("%d"), preview->GetCurrentPage() ); strPage = - wxGetTextFromUser( strPrompt, _("Goto Page"), strPage); + wxGetTextFromUser( strPrompt, _("Goto Page"), strPage, GetParent()); if ( strPage.ToLong( ¤tPage ) ) if (preview->GetPrintout()->HasPage(currentPage)) @@ -571,6 +584,10 @@ void wxPreviewFrame::Initialize() #endif Layout(); + + m_printPreview->AdjustScrollbars(m_previewCanvas); + m_previewCanvas->SetFocus(); + m_controlBar->SetFocus(); } void wxPreviewFrame::CreateCanvas() @@ -632,13 +649,8 @@ void wxPrintPreviewBase::Init(wxPrintout *printout, m_pageWidth = 0; m_pageHeight = 0; m_printingPrepared = FALSE; - - // Too soon! Moved to RenderPage. - // printout->OnPreparePrinting(); - - // Get some parameters from the printout, if defined - int selFrom, selTo; - printout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo); + m_minPage = 1; + m_maxPage = 1; } wxPrintPreviewBase::~wxPrintPreviewBase() @@ -662,17 +674,20 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum) delete m_previewBitmap; m_previewBitmap = NULL; } - + if (m_previewCanvas) { + AdjustScrollbars(m_previewCanvas); + if (!RenderPage(pageNum)) return FALSE; m_previewCanvas->Refresh(); + m_previewCanvas->SetFocus(); } return TRUE; } -bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc) +bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc) { DrawBlankPage(canvas, dc); @@ -708,6 +723,29 @@ bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc) return TRUE; } +// Adjusts the scrollbars for the current scale +void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas *canvas) +{ + if (!canvas) + return ; + + int canvasWidth, canvasHeight; + canvas->GetSize(&canvasWidth, &canvasHeight); + + double zoomScale = ((float)m_currentZoom/(float)100); + double actualWidth = (zoomScale*m_pageWidth*m_previewScale); + double actualHeight = (zoomScale*m_pageHeight*m_previewScale); + + // Set the scrollbars appropriately + int totalWidth = actualWidth + 2*m_leftMargin; + int totalHeight = actualHeight + 2*m_topMargin; + int scrollUnitsX = totalWidth/10; + int scrollUnitsY = totalHeight/10; + wxSize virtualSize = canvas->GetVirtualSize(); + if (virtualSize.GetWidth() != totalWidth || virtualSize.GetHeight() != totalHeight) + canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, TRUE); +} + bool wxPrintPreviewBase::RenderPage(int pageNum) { wxBusyCursor busy; @@ -758,6 +796,8 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) if (!m_printingPrepared) { m_previewPrintout->OnPreparePrinting(); + int selFrom, selTo; + m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo); m_printingPrepared = TRUE; } @@ -797,7 +837,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) } -bool wxPrintPreviewBase::DrawBlankPage(wxWindow *canvas, wxDC& dc) +bool wxPrintPreviewBase::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc) { int canvasWidth, canvasHeight; canvas->GetSize(&canvasWidth, &canvasHeight); @@ -851,10 +891,12 @@ void wxPrintPreviewBase::SetZoom(int percent) if (m_previewCanvas) { + AdjustScrollbars(m_previewCanvas); RenderPage(m_currentPage); ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0); m_previewCanvas->Clear(); m_previewCanvas->Refresh(); + m_previewCanvas->SetFocus(); } } diff --git a/src/generic/printps.cpp b/src/generic/printps.cpp index 79ffa7c8fc..d9e0259f74 100644 --- a/src/generic/printps.cpp +++ b/src/generic/printps.cpp @@ -88,6 +88,7 @@ bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool pro printout->SetIsPreview(FALSE); +#if 0 // 4/9/99, JACS: this is a silly place to allow preparation, considering // the DC and no parameters have been set in the printout object. // Moved further down. @@ -126,7 +127,12 @@ bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool pro } else m_printDialogData.EnablePageNumbers(FALSE); +#endif + if (m_printDialogData.GetMinPage() < 1) + m_printDialogData.SetMinPage(1); + if (m_printDialogData.GetMaxPage() < 1) + m_printDialogData.SetMaxPage(9999); // Create a suitable device context wxDC *dc = (wxDC *) NULL; @@ -171,6 +177,23 @@ bool wxPostScriptPrinter::Print(wxWindow *parent, wxPrintout *printout, bool pro printout->OnPreparePrinting(); + // Get some parameters from the printout, if defined + int fromPage, toPage; + int minPage, maxPage; + printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); + + if (maxPage == 0) + { + sm_lastError = wxPRINTER_ERROR; + wxEndBusyCursor(); + return FALSE; + } + + // Only set min and max, because from and to have been + // set by the user + m_printDialogData.SetMinPage(minPage); + m_printDialogData.SetMaxPage(maxPage); + int pagesPerCopy = m_printDialogData.GetToPage()-m_printDialogData.GetFromPage()+1, totalPages = pagesPerCopy * m_printDialogData.GetNoCopies(), diff --git a/src/html/htmprint.cpp b/src/html/htmprint.cpp index 14b443a30e..1206f2f870 100644 --- a/src/html/htmprint.cpp +++ b/src/html/htmprint.cpp @@ -178,13 +178,11 @@ void wxHtmlPrintout::AddFilter(wxHtmlFilter *filter) m_Filters.Append(filter); } -bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage) +void wxHtmlPrintout::OnPreparePrinting() { int pageWidth, pageHeight, mm_w, mm_h, scr_w, scr_h, dc_w, dc_h; float ppmm_h, ppmm_v; - if (!wxPrintout::OnBeginDocument(startPage, endPage)) return FALSE; - GetPageSizePixels(&pageWidth, &pageHeight); GetPageSizeMM(&mm_w, &mm_h); ppmm_h = (float)pageWidth / mm_w; @@ -236,6 +234,12 @@ bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage) )); m_Renderer->SetHtmlText(m_Document, m_BasePath, m_BasePathIsDir); CountPages(); +} + +bool wxHtmlPrintout::OnBeginDocument(int startPage, int endPage) +{ + if (!wxPrintout::OnBeginDocument(startPage, endPage)) return FALSE; + return TRUE; } @@ -256,9 +260,9 @@ bool wxHtmlPrintout::OnPrintPage(int page) void wxHtmlPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) { *minPage = 1; - *maxPage = wxHTML_PRINT_MAX_PAGES; + *maxPage = m_NumPages; *selPageFrom = 1; - *selPageTo = wxHTML_PRINT_MAX_PAGES; + *selPageTo = m_NumPages; } diff --git a/src/mac/carbon/printmac.cpp b/src/mac/carbon/printmac.cpp index 1a0f8d5121..b7c8915190 100644 --- a/src/mac/carbon/printmac.cpp +++ b/src/mac/carbon/printmac.cpp @@ -535,38 +535,11 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) return FALSE; printout->SetIsPreview(FALSE); - printout->OnPreparePrinting(); - - // Get some parameters from the printout, if defined - int fromPage, toPage; - int minPage, maxPage; - printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); - - if (maxPage == 0) - return FALSE; - - m_printDialogData.SetMinPage(minPage); - m_printDialogData.SetMaxPage(maxPage); - if (fromPage != 0) - m_printDialogData.SetFromPage(fromPage); - if (toPage != 0) - m_printDialogData.SetToPage(toPage); - - if (minPage != 0) - { - m_printDialogData.EnablePageNumbers(TRUE); - if (m_printDialogData.GetFromPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMinPage()); - else if (m_printDialogData.GetFromPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMaxPage()); - if (m_printDialogData.GetToPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMaxPage()); - else if (m_printDialogData.GetToPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMinPage()); - } - else - m_printDialogData.EnablePageNumbers(FALSE); - + if (m_printDialogData.GetMinPage() < 1) + m_printDialogData.SetMinPage(1); + if (m_printDialogData.GetMaxPage() < 1) + m_printDialogData.SetMaxPage(9999); + // Create a suitable device context wxDC *dc = NULL; if (prompt) @@ -609,6 +582,24 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) // Create an abort window wxBeginBusyCursor(); + printout->OnPreparePrinting(); + + // Get some parameters from the printout, if defined + int fromPage, toPage; + int minPage, maxPage; + printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); + + if (maxPage == 0) + { + wxEndBusyCursor(); + return FALSE; + } + + // Only set min and max, because from and to have been + // set by the user + m_printDialogData.SetMinPage(minPage); + m_printDialogData.SetMaxPage(maxPage); + wxWindow *win = CreateAbortWindow(parent, printout); wxSafeYield(win,true); diff --git a/src/mac/printmac.cpp b/src/mac/printmac.cpp index 1a0f8d5121..b7c8915190 100644 --- a/src/mac/printmac.cpp +++ b/src/mac/printmac.cpp @@ -535,38 +535,11 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) return FALSE; printout->SetIsPreview(FALSE); - printout->OnPreparePrinting(); - - // Get some parameters from the printout, if defined - int fromPage, toPage; - int minPage, maxPage; - printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); - - if (maxPage == 0) - return FALSE; - - m_printDialogData.SetMinPage(minPage); - m_printDialogData.SetMaxPage(maxPage); - if (fromPage != 0) - m_printDialogData.SetFromPage(fromPage); - if (toPage != 0) - m_printDialogData.SetToPage(toPage); - - if (minPage != 0) - { - m_printDialogData.EnablePageNumbers(TRUE); - if (m_printDialogData.GetFromPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMinPage()); - else if (m_printDialogData.GetFromPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMaxPage()); - if (m_printDialogData.GetToPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMaxPage()); - else if (m_printDialogData.GetToPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMinPage()); - } - else - m_printDialogData.EnablePageNumbers(FALSE); - + if (m_printDialogData.GetMinPage() < 1) + m_printDialogData.SetMinPage(1); + if (m_printDialogData.GetMaxPage() < 1) + m_printDialogData.SetMaxPage(9999); + // Create a suitable device context wxDC *dc = NULL; if (prompt) @@ -609,6 +582,24 @@ bool wxMacPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt) // Create an abort window wxBeginBusyCursor(); + printout->OnPreparePrinting(); + + // Get some parameters from the printout, if defined + int fromPage, toPage; + int minPage, maxPage; + printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); + + if (maxPage == 0) + { + wxEndBusyCursor(); + return FALSE; + } + + // Only set min and max, because from and to have been + // set by the user + m_printDialogData.SetMinPage(minPage); + m_printDialogData.SetMaxPage(maxPage); + wxWindow *win = CreateAbortWindow(parent, printout); wxSafeYield(win,true); diff --git a/src/msw/printwin.cpp b/src/msw/printwin.cpp index 5c5279e6f4..36691904cc 100644 --- a/src/msw/printwin.cpp +++ b/src/msw/printwin.cpp @@ -107,43 +107,10 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt printout->SetIsPreview(FALSE); - // 4/9/99, JACS: this is a silly place to allow preparation, considering - // the DC and no parameters have been set in the printout object. - // Moved further down. - // printout->OnPreparePrinting(); - - // Get some parameters from the printout, if defined - int fromPage, toPage; - int minPage, maxPage; - printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); - - if (maxPage == 0) - { - sm_lastError = wxPRINTER_ERROR; - return FALSE; - } - - m_printDialogData.SetMinPage(minPage); - m_printDialogData.SetMaxPage(maxPage); - if (fromPage != 0) - m_printDialogData.SetFromPage(fromPage); - if (toPage != 0) - m_printDialogData.SetToPage(toPage); - - if (minPage != 0) - { - m_printDialogData.EnablePageNumbers(TRUE); - if (m_printDialogData.GetFromPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMinPage()); - else if (m_printDialogData.GetFromPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetFromPage(m_printDialogData.GetMaxPage()); - if (m_printDialogData.GetToPage() > m_printDialogData.GetMaxPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMaxPage()); - else if (m_printDialogData.GetToPage() < m_printDialogData.GetMinPage()) - m_printDialogData.SetToPage(m_printDialogData.GetMinPage()); - } - else - m_printDialogData.EnablePageNumbers(FALSE); + if (m_printDialogData.GetMinPage() < 1) + m_printDialogData.SetMinPage(1); + if (m_printDialogData.GetMaxPage() < 1) + m_printDialogData.SetMaxPage(9999); // Create a suitable device context wxDC *dc = NULL; @@ -155,7 +122,6 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt } else { - // dc = new wxPrinterDC("", "", "", FALSE, m_printData.GetOrientation()); dc = new wxPrinterDC(m_printDialogData.GetPrintData()); } @@ -203,6 +169,23 @@ bool wxWindowsPrinter::Print(wxWindow *parent, wxPrintout *printout, bool prompt printout->OnPreparePrinting(); + // Get some parameters from the printout, if defined + int fromPage, toPage; + int minPage, maxPage; + printout->GetPageInfo(&minPage, &maxPage, &fromPage, &toPage); + + if (maxPage == 0) + { + sm_lastError = wxPRINTER_ERROR; + wxEndBusyCursor(); + return FALSE; + } + + // Only set min and max, because from and to have been + // set by the user + m_printDialogData.SetMinPage(minPage); + m_printDialogData.SetMaxPage(maxPage); + wxWindow *win = CreateAbortWindow(parent, printout); wxYield(); -- 2.45.2