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:
@@ -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;
|
||||||
|
@@ -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)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user