1 ///////////////////////////////////////////////////////////////////////////// 
   3 // Purpose:     Printing framework base class implementation 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  13 #pragma implementation "prntbase.h" 
  16 // For compilers that support precompilation, includes "wx.h". 
  17 #include "wx/wxprec.h" 
  25 #if wxUSE_PRINTING_ARCHITECTURE 
  31 #include "wx/msgdlg.h" 
  32 #include "wx/layout.h" 
  33 #include "wx/choice.h" 
  34 #include "wx/button.h" 
  35 #include "wx/settings.h" 
  36 #include "wx/dcmemory.h" 
  37 #include "wx/stattext.h" 
  39 #include "wx/textdlg.h" 
  43 #include "wx/prntbase.h" 
  44 #include "wx/dcprint.h" 
  45 #include "wx/printdlg.h" 
  46 #include "wx/module.h" 
  52     #include "wx/msw/private.h" 
  60 IMPLEMENT_CLASS(wxPrinterBase
, wxObject
) 
  61 IMPLEMENT_ABSTRACT_CLASS(wxPrintout
, wxObject
) 
  62 IMPLEMENT_CLASS(wxPreviewCanvas
, wxWindow
) 
  63 IMPLEMENT_CLASS(wxPreviewControlBar
, wxWindow
) 
  64 IMPLEMENT_CLASS(wxPreviewFrame
, wxFrame
) 
  65 IMPLEMENT_CLASS(wxPrintPreviewBase
, wxObject
) 
  67 BEGIN_EVENT_TABLE(wxPrintAbortDialog
, wxDialog
) 
  68     EVT_BUTTON(wxID_CANCEL
, wxPrintAbortDialog::OnCancel
) 
  71 BEGIN_EVENT_TABLE(wxPreviewCanvas
, wxScrolledWindow
) 
  72     EVT_PAINT(wxPreviewCanvas::OnPaint
) 
  73     EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged
) 
  80 wxPrinterBase::wxPrinterBase(wxPrintDialogData 
*data
) 
  82     m_currentPrintout 
= (wxPrintout 
*) NULL
; 
  83     sm_abortWindow 
= (wxWindow 
*) NULL
; 
  86         m_printDialogData 
= (*data
); 
  87     sm_lastError 
= wxPRINTER_NO_ERROR
; 
  90 wxWindow 
*wxPrinterBase::sm_abortWindow 
= (wxWindow 
*) NULL
; 
  91 bool wxPrinterBase::sm_abortIt 
= FALSE
; 
  92 wxPrinterError 
wxPrinterBase::sm_lastError 
= wxPRINTER_NO_ERROR
; 
  94 wxPrinterBase::~wxPrinterBase() 
  98 void wxPrintAbortDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
)) 
 100     wxPrinterBase::sm_abortIt 
= TRUE
; 
 101     wxPrinterBase::sm_abortWindow
->Show(FALSE
); 
 102     wxPrinterBase::sm_abortWindow
->Close(TRUE
); 
 103     wxPrinterBase::sm_abortWindow 
= (wxWindow 
*) NULL
; 
 106 wxWindow 
*wxPrinterBase::CreateAbortWindow(wxWindow 
*parent
, wxPrintout 
* printout
) 
 108     wxPrintAbortDialog 
*dialog 
= new wxPrintAbortDialog(parent
, _("Printing ") , wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
); 
 110     wxBoxSizer 
*button_sizer 
= new wxBoxSizer( wxVERTICAL 
); 
 111     button_sizer
->Add( new wxStaticText(dialog
, -1, _("Please wait while printing\n") + printout
->GetTitle() ), 0, wxALL
, 10 ); 
 112     button_sizer
->Add( new wxButton( dialog
, wxID_CANCEL
, wxT("Cancel") ), 0, wxALL 
| wxALIGN_CENTER
, 10 ); 
 114     dialog
->SetAutoLayout( TRUE 
); 
 115     dialog
->SetSizer( button_sizer 
); 
 117     button_sizer
->Fit(dialog
); 
 118     button_sizer
->SetSizeHints (dialog
) ; 
 123 void wxPrinterBase::ReportError(wxWindow 
*parent
, wxPrintout 
*WXUNUSED(printout
), const wxString
& message
) 
 125     wxMessageBox(message
, _("Printing Error"), wxOK
, parent
); 
 132 wxPrintout::wxPrintout(const wxString
& title
) 
 134     m_printoutTitle 
= title 
; 
 135     m_printoutDC 
= (wxDC 
*) NULL
; 
 138     m_pageWidthPixels 
= 0; 
 139     m_pageHeightPixels 
= 0; 
 147 wxPrintout::~wxPrintout() 
 151 bool wxPrintout::OnBeginDocument(int WXUNUSED(startPage
), int WXUNUSED(endPage
)) 
 153     return GetDC()->StartDoc(_("Printing ") + m_printoutTitle
); 
 156 void wxPrintout::OnEndDocument() 
 161 void wxPrintout::OnBeginPrinting() 
 165 void wxPrintout::OnEndPrinting() 
 169 bool wxPrintout::HasPage(int page
) 
 174 void wxPrintout::GetPageInfo(int *minPage
, int *maxPage
, int *fromPage
, int *toPage
) 
 186 wxPreviewCanvas::wxPreviewCanvas(wxPrintPreviewBase 
*preview
, wxWindow 
*parent
, 
 187                                  const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
): 
 188 wxScrolledWindow(parent
, -1, pos
, size
, style
, name
) 
 190     m_printPreview 
= preview
; 
 191     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
 193     SetScrollbars(15, 18, 100, 100); 
 196 wxPreviewCanvas::~wxPreviewCanvas() 
 200 void wxPreviewCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
)) 
 207     if (!GetUpdateRegion().IsEmpty()) 
 208         dc.SetClippingRegion( GetUpdateRegion() ); 
 214         m_printPreview
->PaintPage(this, dc
); 
 218 // Responds to colour changes, and passes event on to children. 
 219 void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent
& event
) 
 221     SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE
)); 
 224     // Propagate the event to the non-top-level children 
 225     wxWindow::OnSysColourChanged(event
); 
 229 * Preview control bar 
 232 BEGIN_EVENT_TABLE(wxPreviewControlBar
, wxPanel
) 
 233     EVT_BUTTON(wxID_PREVIEW_CLOSE
,    wxPreviewControlBar::OnWindowClose
) 
 234     EVT_BUTTON(wxID_PREVIEW_PRINT
,    wxPreviewControlBar::OnPrint
) 
 235     EVT_BUTTON(wxID_PREVIEW_PREVIOUS
, wxPreviewControlBar::OnPreviousButton
) 
 236     EVT_BUTTON(wxID_PREVIEW_NEXT
,     wxPreviewControlBar::OnNextButton
) 
 237     EVT_BUTTON(wxID_PREVIEW_FIRST
,    wxPreviewControlBar::OnFirstButton
) 
 238     EVT_BUTTON(wxID_PREVIEW_LAST
,     wxPreviewControlBar::OnLastButton
) 
 239     EVT_BUTTON(wxID_PREVIEW_GOTO
,     wxPreviewControlBar::OnGotoButton
) 
 240     EVT_CHAR(wxPreviewControlBar::OnChar
) 
 241     EVT_CHOICE(wxID_PREVIEW_ZOOM
,     wxPreviewControlBar::OnZoom
) 
 242     EVT_PAINT(wxPreviewControlBar::OnPaint
) 
 245 wxPreviewControlBar::wxPreviewControlBar(wxPrintPreviewBase 
*preview
, long buttons
, 
 246                                          wxWindow 
*parent
, const wxPoint
& pos
, const wxSize
& size
, 
 247                                          long style
, const wxString
& name
): 
 248 wxPanel(parent
, -1, pos
, size
, style
, name
) 
 250     m_printPreview 
= preview
; 
 251     m_closeButton 
= (wxButton 
*) NULL
; 
 252     m_nextPageButton 
= (wxButton 
*) NULL
; 
 253     m_previousPageButton 
= (wxButton 
*) NULL
; 
 254     m_printButton 
= (wxButton 
*) NULL
; 
 255     m_zoomControl 
= (wxChoice 
*) NULL
; 
 256     m_buttonFlags 
= buttons
; 
 259 wxPreviewControlBar::~wxPreviewControlBar() 
 263 void wxPreviewControlBar::OnPaint(wxPaintEvent
& WXUNUSED(event
)) 
 269     dc
.SetPen(*wxBLACK_PEN
); 
 270     dc
.SetBrush(*wxTRANSPARENT_BRUSH
); 
 271     dc
.DrawLine( 0, h
-1, w
, h
-1 ); 
 274 void wxPreviewControlBar::OnWindowClose(wxCommandEvent
& WXUNUSED(event
)) 
 276     wxPreviewFrame 
*frame 
= (wxPreviewFrame 
*)GetParent(); 
 280 void wxPreviewControlBar::OnPrint(wxCommandEvent
& WXUNUSED(event
)) 
 282     wxPrintPreviewBase 
*preview 
= GetPrintPreview(); 
 283     preview
->Print(TRUE
); 
 286 void wxPreviewControlBar::OnChar(wxKeyEvent 
&event
) 
 288    switch(event
.GetKeyCode()) 
 305 void wxPreviewControlBar::OnNext(void) 
 307     wxPrintPreviewBase 
*preview 
= GetPrintPreview(); 
 310         int currentPage 
= preview
->GetCurrentPage(); 
 311         if ((preview
->GetMaxPage() > 0) && 
 312             (currentPage 
< preview
->GetMaxPage()) && 
 313             preview
->GetPrintout()->HasPage(currentPage 
+ 1)) 
 315             preview
->SetCurrentPage(currentPage 
+ 1); 
 320 void wxPreviewControlBar::OnPrevious(void) 
 322     wxPrintPreviewBase 
*preview 
= GetPrintPreview(); 
 325         int currentPage 
= preview
->GetCurrentPage(); 
 326         if ((preview
->GetMinPage() > 0) && 
 327             (currentPage 
> preview
->GetMinPage()) && 
 328             preview
->GetPrintout()->HasPage(currentPage 
- 1)) 
 330             preview
->SetCurrentPage(currentPage 
- 1); 
 335 void wxPreviewControlBar::OnFirst(void) 
 337     wxPrintPreviewBase 
*preview 
= GetPrintPreview(); 
 340         int currentPage 
= preview
->GetMinPage(); 
 341         if (preview
->GetPrintout()->HasPage(currentPage
)) 
 343             preview
->SetCurrentPage(currentPage
); 
 348 void wxPreviewControlBar::OnLast(void) 
 350     wxPrintPreviewBase 
*preview 
= GetPrintPreview(); 
 353         int currentPage 
= preview
->GetMaxPage(); 
 354         if (preview
->GetPrintout()->HasPage(currentPage
)) 
 356             preview
->SetCurrentPage(currentPage
); 
 361 void wxPreviewControlBar::OnGoto(void) 
 363     wxPrintPreviewBase 
*preview 
= GetPrintPreview(); 
 368         if (preview
->GetMinPage() > 0) 
 373             strPrompt
.Printf( wxT("%d...%d"), 
 374                 preview
->GetMinPage(), preview
->GetMaxPage()); 
 375             strPage
.Printf( wxT("%d"), preview
->GetCurrentPage() ); 
 378                 wxGetTextFromUser( strPrompt
, _("Goto Page"), strPage
); 
 380             if ( strPage
.ToLong( ¤tPage 
) ) 
 381                 if (preview
->GetPrintout()->HasPage(currentPage
)) 
 383                     preview
->SetCurrentPage(currentPage
); 
 389 void wxPreviewControlBar::OnZoom(wxCommandEvent
& WXUNUSED(event
)) 
 391     int zoom 
= GetZoomControl(); 
 392     if (GetPrintPreview()) 
 393         GetPrintPreview()->SetZoom(zoom
); 
 396 void wxPreviewControlBar::CreateButtons() 
 398     SetSize(0, 0, 400, 40); 
 400     wxBoxSizer 
*item0 
= new wxBoxSizer( wxHORIZONTAL 
); 
 402     int smallButtonWidth 
= 45; 
 404     m_closeButton 
= new wxButton( this, wxID_PREVIEW_CLOSE
, _("&Close"), wxDefaultPosition
, wxDefaultSize
, 0 ); 
 405     item0
->Add( m_closeButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 ); 
 407     if (m_buttonFlags 
& wxPREVIEW_PRINT
) 
 409         m_printButton 
= new wxButton( this, wxID_PREVIEW_PRINT
, _("&Print..."), wxDefaultPosition
, wxDefaultSize
, 0 ); 
 410         item0
->Add( m_printButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 ); 
 413     if (m_buttonFlags 
& wxPREVIEW_FIRST
) 
 415         m_firstPageButton 
= new wxButton( this, wxID_PREVIEW_FIRST
, _("|<<"), wxDefaultPosition
, wxSize(smallButtonWidth
,-1), 0 ); 
 416         item0
->Add( m_firstPageButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 ); 
 419     if (m_buttonFlags 
& wxPREVIEW_PREVIOUS
) 
 421         m_previousPageButton 
= new wxButton( this, wxID_PREVIEW_PREVIOUS
, _("<<"), wxDefaultPosition
, wxSize(smallButtonWidth
,-1), 0 ); 
 422         item0
->Add( m_previousPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 ); 
 425     if (m_buttonFlags 
& wxPREVIEW_NEXT
) 
 427         m_nextPageButton 
= new wxButton( this, wxID_PREVIEW_NEXT
, _(">>"), wxDefaultPosition
, wxSize(smallButtonWidth
,-1), 0 ); 
 428         item0
->Add( m_nextPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 ); 
 431     if (m_buttonFlags 
& wxPREVIEW_LAST
) 
 433         m_lastPageButton 
= new wxButton( this, wxID_PREVIEW_LAST
, _(">>|"), wxDefaultPosition
, wxSize(smallButtonWidth
,-1), 0 ); 
 434         item0
->Add( m_lastPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 ); 
 437     if (m_buttonFlags 
& wxPREVIEW_GOTO
) 
 439         m_gotoPageButton 
= new wxButton( this, wxID_PREVIEW_GOTO
, _("&Goto..."), wxDefaultPosition
, wxDefaultSize
, 0 ); 
 440         item0
->Add( m_gotoPageButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 ); 
 443     if (m_buttonFlags 
& wxPREVIEW_ZOOM
) 
 447             wxT("10%"), wxT("15%"), wxT("20%"), wxT("25%"), wxT("30%"), wxT("35%"), wxT("40%"), wxT("45%"), wxT("50%"), wxT("55%"), 
 448                 wxT("60%"), wxT("65%"), wxT("70%"), wxT("75%"), wxT("80%"), wxT("85%"), wxT("90%"), wxT("95%"), wxT("100%"), wxT("110%"), 
 449                 wxT("120%"), wxT("150%"), wxT("200%") 
 451         int n 
= WXSIZEOF(choices
); 
 453         m_zoomControl 
= new wxChoice( this, wxID_PREVIEW_ZOOM
, wxDefaultPosition
, wxSize(70,-1), n
, choices
, 0 ); 
 454         item0
->Add( m_zoomControl
, 0, wxALIGN_CENTRE
|wxALL
, 5 ); 
 455         SetZoomControl(m_printPreview
->GetZoom()); 
 462 void wxPreviewControlBar::SetZoomControl(int zoom
) 
 465     wxSprintf( buf
, wxT("%d%%"), zoom 
); 
 468         m_zoomControl
->SetStringSelection(buf
); 
 471 int wxPreviewControlBar::GetZoomControl() 
 474     if (m_zoomControl 
&& (m_zoomControl
->GetStringSelection() != wxT(""))) 
 476         wxStrcpy(buf
, m_zoomControl
->GetStringSelection()); 
 477         buf
[wxStrlen(buf
) - 1] = 0; 
 478         return (int)wxAtoi(buf
); 
 488 BEGIN_EVENT_TABLE(wxPreviewFrame
, wxFrame
) 
 489     EVT_CLOSE(wxPreviewFrame::OnCloseWindow
) 
 492 wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase 
*preview
, wxFrame 
*parent
, const wxString
& title
, 
 493                                const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
): 
 494 wxFrame(parent
, -1, title
, pos
, size
, style
, name
) 
 496     m_printPreview 
= preview
; 
 498     m_previewCanvas 
= NULL
; 
 501 wxPreviewFrame::~wxPreviewFrame() 
 505 void wxPreviewFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
)) 
 507     // MakeModal doesn't work on wxMac, especially when there 
 508     // are multiple top-level windows. 
 513     // Need to delete the printout and the print preview 
 514     wxPrintout 
*printout 
= m_printPreview
->GetPrintout(); 
 518         m_printPreview
->SetPrintout(NULL
); 
 519         m_printPreview
->SetCanvas(NULL
); 
 520         m_printPreview
->SetFrame(NULL
); 
 522     delete m_printPreview
; 
 527 void wxPreviewFrame::Initialize() 
 533     m_printPreview
->SetCanvas(m_previewCanvas
); 
 534     m_printPreview
->SetFrame(this); 
 536     wxBoxSizer 
*item0 
= new wxBoxSizer( wxVERTICAL 
); 
 538     item0
->Add( m_controlBar
, 0, wxGROW
|wxALIGN_CENTER_VERTICAL
, 5 ); 
 539     item0
->Add( m_previewCanvas
, 1, wxGROW
|wxALIGN_CENTER_VERTICAL
, 5 ); 
 541     SetAutoLayout( TRUE 
); 
 544     // MakeModal doesn't work on wxMac, especially when there 
 545     // are multiple top-level windows. 
 553 void wxPreviewFrame::CreateCanvas() 
 555     m_previewCanvas 
= new wxPreviewCanvas(m_printPreview
, this); 
 558 void wxPreviewFrame::CreateControlBar() 
 560     long buttons 
= wxPREVIEW_DEFAULT
; 
 561     if (m_printPreview
->GetPrintoutForPrinting()) 
 562         buttons 
|= wxPREVIEW_PRINT
; 
 564     m_controlBar 
= new wxPreviewControlBar(m_printPreview
, buttons
, this, wxPoint(0, 0), wxSize(400, 40)); 
 565     m_controlBar
->CreateButtons(); 
 572 wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout 
*printout
, 
 573                                        wxPrintout 
*printoutForPrinting
, 
 577         m_printDialogData 
= (*data
); 
 579     Init(printout
, printoutForPrinting
); 
 582 wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout 
*printout
, 
 583                                        wxPrintout 
*printoutForPrinting
, 
 584                                        wxPrintDialogData 
*data
) 
 587         m_printDialogData 
= (*data
); 
 589     Init(printout
, printoutForPrinting
); 
 592 void wxPrintPreviewBase::Init(wxPrintout 
*printout
, 
 593                               wxPrintout 
*printoutForPrinting
) 
 596     m_previewPrintout 
= printout
; 
 597     if (m_previewPrintout
) 
 598         m_previewPrintout
->SetIsPreview(TRUE
); 
 600     m_printPrintout 
= printoutForPrinting
; 
 602     m_previewCanvas 
= NULL
; 
 603     m_previewFrame 
= NULL
; 
 604     m_previewBitmap 
= NULL
; 
 611     m_printingPrepared 
= FALSE
; 
 613     // Too soon! Moved to RenderPage. 
 614     // printout->OnPreparePrinting(); 
 616     // Get some parameters from the printout, if defined 
 618     printout
->GetPageInfo(&m_minPage
, &m_maxPage
, &selFrom
, &selTo
); 
 621 wxPrintPreviewBase::~wxPrintPreviewBase() 
 623     if (m_previewPrintout
) 
 624         delete m_previewPrintout
; 
 626         delete m_previewBitmap
; 
 628         delete m_printPrintout
; 
 631 bool wxPrintPreviewBase::SetCurrentPage(int pageNum
) 
 633     if (m_currentPage 
== pageNum
) 
 636     m_currentPage 
= pageNum
; 
 639         delete m_previewBitmap
; 
 640         m_previewBitmap 
= NULL
; 
 645         if (!RenderPage(pageNum
)) 
 647         m_previewCanvas
->Refresh(); 
 652 bool wxPrintPreviewBase::PaintPage(wxWindow 
*canvas
, wxDC
& dc
) 
 654     DrawBlankPage(canvas
, dc
); 
 656     if (!m_previewBitmap
) 
 657         if (!RenderPage(m_currentPage
)) 
 660     if (!m_previewBitmap
) 
 666     int canvasWidth
, canvasHeight
; 
 667     canvas
->GetSize(&canvasWidth
, &canvasHeight
); 
 669     double zoomScale 
= ((float)m_currentZoom
/(float)100); 
 670     double actualWidth 
= (zoomScale
*m_pageWidth
*m_previewScale
); 
 671     //  float actualHeight = (float)(zoomScale*m_pageHeight*m_previewScale); 
 673     int x 
= (int) ((canvasWidth 
- actualWidth
)/2.0); 
 674     if (x 
< m_leftMargin
) 
 679     temp_dc
.SelectObject(*m_previewBitmap
); 
 681     dc
.Blit(x
, y
, m_previewBitmap
->GetWidth(), m_previewBitmap
->GetHeight(), &temp_dc
, 0, 0); 
 683     temp_dc
.SelectObject(wxNullBitmap
); 
 688 bool wxPrintPreviewBase::RenderPage(int pageNum
) 
 692     int canvasWidth
, canvasHeight
; 
 694     if (!m_previewCanvas
) 
 696         wxFAIL_MSG(_T("wxPrintPreviewBase::RenderPage: must use wxPrintPreviewBase::SetCanvas to let me know about the canvas!")); 
 700     m_previewCanvas
->GetSize(&canvasWidth
, &canvasHeight
); 
 702     double zoomScale 
= (m_currentZoom
/100.0); 
 703     int actualWidth 
= (int)(zoomScale
*m_pageWidth
*m_previewScale
); 
 704     int actualHeight 
= (int)(zoomScale
*m_pageHeight
*m_previewScale
); 
 706     int x 
= (int)((canvasWidth 
- actualWidth
)/2.0); 
 707     if (x 
< m_leftMargin
) 
 709     //  int y = m_topMargin; 
 712     if (!m_previewBitmap
) 
 714         m_previewBitmap 
= new wxBitmap((int)actualWidth
, (int)actualHeight
); 
 715         if (!m_previewBitmap 
|| !m_previewBitmap
->Ok()) 
 717             if (m_previewBitmap
) { 
 718                 delete m_previewBitmap
; 
 719                 m_previewBitmap 
= NULL
; 
 721             wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK
); 
 727     memoryDC
.SelectObject(*m_previewBitmap
); 
 731     m_previewPrintout
->SetDC(&memoryDC
); 
 732     m_previewPrintout
->SetPageSizePixels(m_pageWidth
, m_pageHeight
); 
 734     // Need to delay OnPreparePrinting until here, so we have enough information. 
 735     if (!m_printingPrepared
) 
 737         m_previewPrintout
->OnPreparePrinting(); 
 738         m_printingPrepared 
= TRUE
; 
 741     m_previewPrintout
->OnBeginPrinting(); 
 743     if (!m_previewPrintout
->OnBeginDocument(m_printDialogData
.GetFromPage(), m_printDialogData
.GetToPage())) 
 745         wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK
); 
 747         memoryDC
.SelectObject(wxNullBitmap
); 
 749         delete m_previewBitmap
; 
 750         m_previewBitmap 
= NULL
; 
 754     m_previewPrintout
->OnPrintPage(pageNum
); 
 755     m_previewPrintout
->OnEndDocument(); 
 756     m_previewPrintout
->OnEndPrinting(); 
 758     m_previewPrintout
->SetDC(NULL
); 
 760     memoryDC
.SelectObject(wxNullBitmap
); 
 764         wxSprintf(buf
, _("Page %d of %d"), pageNum
, m_maxPage
); 
 766         wxSprintf(buf
, _("Page %d"), pageNum
); 
 769         m_previewFrame
->SetStatusText(buf
); 
 775 bool wxPrintPreviewBase::DrawBlankPage(wxWindow 
*canvas
, wxDC
& dc
) 
 777     int canvasWidth
, canvasHeight
; 
 778     canvas
->GetSize(&canvasWidth
, &canvasHeight
); 
 780     float zoomScale 
= (float)((float)m_currentZoom
/(float)100); 
 781     float actualWidth 
= zoomScale
*m_pageWidth
*m_previewScale
; 
 782     float actualHeight 
= zoomScale
*m_pageHeight
*m_previewScale
; 
 784     float x 
= (float)((canvasWidth 
- actualWidth
)/2.0); 
 785     if (x 
< m_leftMargin
) 
 786         x 
= (float)m_leftMargin
; 
 787     float y 
= (float)m_topMargin
; 
 789     // Draw shadow, allowing for 1-pixel border AROUND the actual page 
 790     int shadowOffset 
= 4; 
 791     dc
.SetPen(*wxBLACK_PEN
); 
 792     dc
.SetBrush(*wxBLACK_BRUSH
); 
 794     dc.DrawRectangle((int)(x-1 + shadowOffset), (int)(y-1 + shadowOffset), (int)(actualWidth+2), (int)(actualHeight+2)); 
 796     dc
.DrawRectangle((int)(x 
+ shadowOffset
), (int)(y 
+ actualHeight
+1), (int)(actualWidth
), shadowOffset
); 
 797     dc
.DrawRectangle((int)(x 
+ actualWidth
), (int)(y 
+ shadowOffset
), shadowOffset
, (int)(actualHeight
)); 
 799     // Draw blank page allowing for 1-pixel border AROUND the actual page 
 800     dc
.SetPen(*wxBLACK_PEN
); 
 801     dc
.SetBrush(*wxWHITE_BRUSH
); 
 804     wxRegion update_region = canvas->GetUpdateRegion(); 
 805     wxRect r = update_region.GetBox(); 
 807       printf( "x: %d y: %d w: %d h: %d.\n", (int)r.x, (int)r.y, (int)r.width, (int)r.height ); 
 810     dc
.DrawRectangle((int)(x
-2), (int)(y
-1), (int)(actualWidth
+3), (int)(actualHeight
+2)); 
 815 void wxPrintPreviewBase::SetZoom(int percent
) 
 817     if (m_currentZoom 
== percent
) 
 820     m_currentZoom 
= percent
; 
 823         delete m_previewBitmap
; 
 824         m_previewBitmap 
= NULL
; 
 829         RenderPage(m_currentPage
); 
 830         ((wxScrolledWindow 
*) m_previewCanvas
)->Scroll(0, 0); 
 831         m_previewCanvas
->Clear(); 
 832         m_previewCanvas
->Refresh(); 
 836 #endif // wxUSE_PRINTING_ARCHITECTURE