// 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;
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.
m_previewCanvas = NULL;
m_previewFrame = NULL;
m_previewBitmap = NULL;
+ m_previewFailed = false;
m_currentPage = 1;
m_currentZoom = 70;
m_topMargin = 40;
return true;
m_currentPage = pageNum;
- if (m_previewBitmap)
- {
- delete m_previewBitmap;
- m_previewBitmap = NULL;
- }
+
+ InvalidatePreviewBitmap();
if (m_previewCanvas)
{
}
+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;
}
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;
}
memoryDC.SelectObject(wxNullBitmap);
- delete m_previewBitmap;
- m_previewBitmap = NULL;
+ InvalidatePreviewBitmap();
return false;
}
return;
m_currentZoom = percent;
- if (m_previewBitmap)
- {
- delete m_previewBitmap;
- m_previewBitmap = NULL;
- }
+
+ InvalidatePreviewBitmap();
if (m_previewCanvas)
{