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
This commit is contained in:
Václav Slavík
2008-06-16 07:43:59 +00:00
parent 6e615e25fa
commit 88b987876d
2 changed files with 36 additions and 18 deletions

View File

@@ -561,11 +561,15 @@ public:
// the currently selected printer. // the currently selected printer.
virtual void DetermineScaling() = 0; virtual void DetermineScaling() = 0;
protected:
void InvalidatePreviewBitmap();
protected: protected:
wxPrintDialogData m_printDialogData; wxPrintDialogData m_printDialogData;
wxPreviewCanvas* m_previewCanvas; wxPreviewCanvas* m_previewCanvas;
wxFrame* m_previewFrame; wxFrame* m_previewFrame;
wxBitmap* m_previewBitmap; wxBitmap* m_previewBitmap;
bool m_previewFailed;
wxPrintout* m_previewPrintout; wxPrintout* m_previewPrintout;
wxPrintout* m_printPrintout; wxPrintout* m_printPrintout;
int m_currentPage; int m_currentPage;

View File

@@ -862,12 +862,21 @@ void wxPreviewCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
void wxPreviewCanvas::OnIdle(wxIdleEvent& 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 )
{ {
if ( m_printPreview->UpdatePageRendering() ) if ( m_printPreview->UpdatePageRendering() )
Refresh(); Refresh();
} }
event.Skip();
s_inIdle = false;
} }
// Responds to colour changes, and passes event on to children. // Responds to colour changes, and passes event on to children.
@@ -1372,6 +1381,7 @@ void wxPrintPreviewBase::Init(wxPrintout *printout,
m_previewCanvas = NULL; m_previewCanvas = NULL;
m_previewFrame = NULL; m_previewFrame = NULL;
m_previewBitmap = NULL; m_previewBitmap = NULL;
m_previewFailed = false;
m_currentPage = 1; m_currentPage = 1;
m_currentZoom = 70; m_currentZoom = 70;
m_topMargin = 40; m_topMargin = 40;
@@ -1399,11 +1409,8 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum)
return true; return true;
m_currentPage = pageNum; m_currentPage = pageNum;
if (m_previewBitmap)
{ InvalidatePreviewBitmap();
delete m_previewBitmap;
m_previewBitmap = NULL;
}
if (m_previewCanvas) if (m_previewCanvas)
{ {
@@ -1465,14 +1472,28 @@ 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() bool wxPrintPreviewBase::UpdatePageRendering()
{ {
if ( m_previewBitmap ) if ( m_previewBitmap )
return false; return false;
if ( !RenderPage(m_currentPage) ) if ( m_previewFailed )
return false; return false;
if ( !RenderPage(m_currentPage) )
{
m_previewFailed = true; // don't waste time failing again
return false;
}
return true; return true;
} }
@@ -1533,10 +1554,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum)
if (!m_previewBitmap || !m_previewBitmap->Ok()) if (!m_previewBitmap || !m_previewBitmap->Ok())
{ {
if (m_previewBitmap) { InvalidatePreviewBitmap();
delete m_previewBitmap;
m_previewBitmap = NULL;
}
wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK); wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK);
return false; return false;
} }
@@ -1567,8 +1585,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum)
memoryDC.SelectObject(wxNullBitmap); memoryDC.SelectObject(wxNullBitmap);
delete m_previewBitmap; InvalidatePreviewBitmap();
m_previewBitmap = NULL;
return false; return false;
} }
@@ -1626,11 +1643,8 @@ void wxPrintPreviewBase::SetZoom(int percent)
return; return;
m_currentZoom = percent; m_currentZoom = percent;
if (m_previewBitmap)
{ InvalidatePreviewBitmap();
delete m_previewBitmap;
m_previewBitmap = NULL;
}
if (m_previewCanvas) if (m_previewCanvas)
{ {