BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow)
EVT_PAINT(wxPreviewCanvas::OnPaint)
EVT_CHAR(wxPreviewCanvas::OnChar)
+ EVT_IDLE(wxPreviewCanvas::OnIdle)
EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged)
#if wxUSE_MOUSEWHEEL
EVT_MOUSEWHEEL(wxPreviewCanvas::OnMouseWheel)
}
}
+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();
+ }
+
+ s_inIdle = false;
+}
+
// Responds to colour changes, and passes event on to children.
void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event)
{
m_printPreview->SetCanvas(NULL);
m_printPreview->SetFrame(NULL);
}
- delete m_printPreview;
+
+ m_previewCanvas->SetPreview(NULL);
+ wxDELETE(m_printPreview);
Destroy();
}
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)
{
AdjustScrollbars(m_previewCanvas);
- if (!RenderPage(pageNum))
- return false;
m_previewCanvas->Refresh();
m_previewCanvas->SetFocus();
}
}
+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;
+}
+
bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc)
{
DrawBlankPage(canvas, dc);
- if (!m_previewBitmap)
- if (!RenderPage(m_currentPage))
- return false;
if (!m_previewBitmap)
return false;
if (!canvas)
canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, true);
}
+bool wxPrintPreviewBase::RenderPageIntoDC(wxDC& dc, int pageNum)
+{
+ m_previewPrintout->SetDC(&dc);
+ m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight);
+
+ // Need to delay OnPreparePrinting() until here, so we have enough
+ // information.
+ if (!m_printingPrepared)
+ {
+ m_previewPrintout->OnPreparePrinting();
+ int selFrom, selTo;
+ m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo);
+ m_printingPrepared = true;
+ }
+
+ m_previewPrintout->OnBeginPrinting();
+
+ if (!m_previewPrintout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage()))
+ {
+ wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK);
+ return false;
+ }
+
+ m_previewPrintout->OnPrintPage(pageNum);
+ m_previewPrintout->OnEndDocument();
+ m_previewPrintout->OnEndPrinting();
+
+ m_previewPrintout->SetDC(NULL);
+
+ return true;
+}
+
+bool wxPrintPreviewBase::RenderPageIntoBitmap(wxBitmap& bmp, int pageNum)
+{
+ wxMemoryDC memoryDC;
+ memoryDC.SelectObject(bmp);
+ memoryDC.Clear();
+
+ return RenderPageIntoDC(memoryDC, pageNum);
+}
+
bool wxPrintPreviewBase::RenderPage(int pageNum)
{
wxBusyCursor busy;
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;
}
}
- wxMemoryDC memoryDC;
- memoryDC.SelectObject(*m_previewBitmap);
-
- memoryDC.Clear();
-
- m_previewPrintout->SetDC(&memoryDC);
- m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight);
-
- // Need to delay OnPreparePrinting until here, so we have enough information.
- if (!m_printingPrepared)
- {
- m_previewPrintout->OnPreparePrinting();
- int selFrom, selTo;
- m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo);
- m_printingPrepared = true;
- }
-
- m_previewPrintout->OnBeginPrinting();
-
- if (!m_previewPrintout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage()))
+ if ( !RenderPageIntoBitmap(*m_previewBitmap, pageNum) )
{
- wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK);
-
- memoryDC.SelectObject(wxNullBitmap);
-
- delete m_previewBitmap;
- m_previewBitmap = NULL;
+ InvalidatePreviewBitmap();
+ wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK);
return false;
}
- m_previewPrintout->OnPrintPage(pageNum);
- m_previewPrintout->OnEndDocument();
- m_previewPrintout->OnEndPrinting();
-
- m_previewPrintout->SetDC(NULL);
-
- memoryDC.SelectObject(wxNullBitmap);
-
#if wxUSE_STATUSBAR
wxString status;
if (m_maxPage != 0)
return;
m_currentZoom = percent;
- if (m_previewBitmap)
- {
- delete m_previewBitmap;
- m_previewBitmap = NULL;
- }
+
+ InvalidatePreviewBitmap();
if (m_previewCanvas)
{
AdjustScrollbars(m_previewCanvas);
- RenderPage(m_currentPage);
((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0);
m_previewCanvas->ClearBackground();
m_previewCanvas->Refresh();
return m_pimpl->PaintPage( canvas, dc );
}
+bool wxPrintPreview::UpdatePageRendering()
+{
+ return m_pimpl->UpdatePageRendering();
+}
+
bool wxPrintPreview::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc)
{
return m_pimpl->DrawBlankPage( canvas, dc );