From 88b987876d4e8d18580f8dd1705b7471aa91388b Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= Date: Mon, 16 Jun 2008 07:43:59 +0000 Subject: [PATCH] fixed printing preview to not report errors in infinite loop (bug introduced by r54133) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54261 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/prntbase.h | 4 ++++ src/common/prntbase.cpp | 48 ++++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/include/wx/prntbase.h b/include/wx/prntbase.h index 011edd1f23..e5f91f9e3d 100644 --- a/include/wx/prntbase.h +++ b/include/wx/prntbase.h @@ -561,11 +561,15 @@ public: // the currently selected printer. virtual void DetermineScaling() = 0; +protected: + void InvalidatePreviewBitmap(); + protected: wxPrintDialogData m_printDialogData; wxPreviewCanvas* m_previewCanvas; wxFrame* m_previewFrame; wxBitmap* m_previewBitmap; + bool m_previewFailed; wxPrintout* m_previewPrintout; wxPrintout* m_printPrintout; int m_currentPage; diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index 16bea8a4a6..f0b86a8c4a 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -862,12 +862,21 @@ void wxPreviewCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) void wxPreviewCanvas::OnIdle(wxIdleEvent& event) { + event.Skip(); + + // prevent UpdatePageRendering() from being called recursively: + static bool s_inIdle = false; + if ( s_inIdle ) + return; + s_inIdle = true; + if ( m_printPreview ) { if ( m_printPreview->UpdatePageRendering() ) Refresh(); } - event.Skip(); + + s_inIdle = false; } // Responds to colour changes, and passes event on to children. @@ -1372,6 +1381,7 @@ void wxPrintPreviewBase::Init(wxPrintout *printout, m_previewCanvas = NULL; m_previewFrame = NULL; m_previewBitmap = NULL; + m_previewFailed = false; m_currentPage = 1; m_currentZoom = 70; m_topMargin = 40; @@ -1399,11 +1409,8 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum) return true; m_currentPage = pageNum; - if (m_previewBitmap) - { - delete m_previewBitmap; - m_previewBitmap = NULL; - } + + InvalidatePreviewBitmap(); if (m_previewCanvas) { @@ -1465,13 +1472,27 @@ void wxPrintPreviewBase::CalcRects(wxPreviewCanvas *canvas, wxRect& pageRect, wx } +void wxPrintPreviewBase::InvalidatePreviewBitmap() +{ + wxDELETE(m_previewBitmap); + // if there was a problem with rendering the preview, try again now + // that it changed in some way (less memory may be needed, for example): + m_previewFailed = false; +} + bool wxPrintPreviewBase::UpdatePageRendering() { if ( m_previewBitmap ) return false; + if ( m_previewFailed ) + return false; + if ( !RenderPage(m_currentPage) ) + { + m_previewFailed = true; // don't waste time failing again return false; + } return true; } @@ -1533,10 +1554,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) if (!m_previewBitmap || !m_previewBitmap->Ok()) { - if (m_previewBitmap) { - delete m_previewBitmap; - m_previewBitmap = NULL; - } + InvalidatePreviewBitmap(); wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK); return false; } @@ -1567,8 +1585,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) memoryDC.SelectObject(wxNullBitmap); - delete m_previewBitmap; - m_previewBitmap = NULL; + InvalidatePreviewBitmap(); return false; } @@ -1626,11 +1643,8 @@ void wxPrintPreviewBase::SetZoom(int percent) return; m_currentZoom = percent; - if (m_previewBitmap) - { - delete m_previewBitmap; - m_previewBitmap = NULL; - } + + InvalidatePreviewBitmap(); if (m_previewCanvas) { -- 2.45.2