1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Printing framework base class implementation
4 // Author: Julian Smart
8 // Copyright: (c) Julian Smart
9 // Licence: wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
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_CHAR(wxPreviewCanvas::OnChar
)
74 EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged
)
81 wxPrinterBase::wxPrinterBase(wxPrintDialogData
*data
)
83 m_currentPrintout
= (wxPrintout
*) NULL
;
84 sm_abortWindow
= (wxWindow
*) NULL
;
87 m_printDialogData
= (*data
);
88 sm_lastError
= wxPRINTER_NO_ERROR
;
91 wxWindow
*wxPrinterBase::sm_abortWindow
= (wxWindow
*) NULL
;
92 bool wxPrinterBase::sm_abortIt
= false;
93 wxPrinterError
wxPrinterBase::sm_lastError
= wxPRINTER_NO_ERROR
;
95 wxPrinterBase::~wxPrinterBase()
99 void wxPrintAbortDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
))
101 wxPrinterBase::sm_abortIt
= true;
102 wxPrinterBase::sm_abortWindow
->Show(false);
103 wxPrinterBase::sm_abortWindow
->Close(true);
104 wxPrinterBase::sm_abortWindow
= (wxWindow
*) NULL
;
107 wxWindow
*wxPrinterBase::CreateAbortWindow(wxWindow
*parent
, wxPrintout
* printout
)
109 wxPrintAbortDialog
*dialog
= new wxPrintAbortDialog(parent
, _("Printing ") , wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
);
111 wxBoxSizer
*button_sizer
= new wxBoxSizer( wxVERTICAL
);
112 button_sizer
->Add( new wxStaticText(dialog
, wxID_ANY
, _("Please wait while printing\n") + printout
->GetTitle() ), 0, wxALL
, 10 );
113 button_sizer
->Add( new wxButton( dialog
, wxID_CANCEL
, wxT("Cancel") ), 0, wxALL
| wxALIGN_CENTER
, 10 );
115 dialog
->SetAutoLayout( true );
116 dialog
->SetSizer( button_sizer
);
118 button_sizer
->Fit(dialog
);
119 button_sizer
->SetSizeHints (dialog
) ;
124 void wxPrinterBase::ReportError(wxWindow
*parent
, wxPrintout
*WXUNUSED(printout
), const wxString
& message
)
126 wxMessageBox(message
, _("Printing Error"), wxOK
, parent
);
133 wxPrintout::wxPrintout(const wxString
& title
)
135 m_printoutTitle
= title
;
136 m_printoutDC
= (wxDC
*) NULL
;
139 m_pageWidthPixels
= 0;
140 m_pageHeightPixels
= 0;
148 wxPrintout::~wxPrintout()
152 bool wxPrintout::OnBeginDocument(int WXUNUSED(startPage
), int WXUNUSED(endPage
))
154 return GetDC()->StartDoc(_("Printing ") + m_printoutTitle
);
157 void wxPrintout::OnEndDocument()
162 void wxPrintout::OnBeginPrinting()
166 void wxPrintout::OnEndPrinting()
170 bool wxPrintout::HasPage(int page
)
175 void wxPrintout::GetPageInfo(int *minPage
, int *maxPage
, int *fromPage
, int *toPage
)
187 // VZ: the current code doesn't refresh properly without
188 // wxFULL_REPAINT_ON_RESIZE, this must be fixed as otherwise we have
189 // really horrible flicker when resizing the preview frame, but without
190 // this style it simply doesn't work correctly at all...
191 wxPreviewCanvas::wxPreviewCanvas(wxPrintPreviewBase
*preview
, wxWindow
*parent
,
192 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
):
193 wxScrolledWindow(parent
, wxID_ANY
, pos
, size
, style
| wxFULL_REPAINT_ON_RESIZE
, name
)
195 m_printPreview
= preview
;
197 // The app workspace colour is always white, but we should have
198 // a contrast with the page.
199 wxSystemColour colourIndex
= wxSYS_COLOUR_3DDKSHADOW
;
201 wxSystemColour colourIndex
= wxSYS_COLOUR_APPWORKSPACE
;
203 SetBackgroundColour(wxSystemSettings::GetColour(colourIndex
));
205 SetScrollbars(10, 10, 100, 100);
208 wxPreviewCanvas::~wxPreviewCanvas()
212 void wxPreviewCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
219 if (!GetUpdateRegion().IsEmpty())
220 dc.SetClippingRegion( GetUpdateRegion() );
226 m_printPreview
->PaintPage(this, dc
);
230 // Responds to colour changes, and passes event on to children.
231 void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent
& event
)
234 // The app workspace colour is always white, but we should have
235 // a contrast with the page.
236 wxSystemColour colourIndex
= wxSYS_COLOUR_3DDKSHADOW
;
238 wxSystemColour colourIndex
= wxSYS_COLOUR_APPWORKSPACE
;
240 SetBackgroundColour(wxSystemSettings::GetColour(colourIndex
));
243 // Propagate the event to the non-top-level children
244 wxWindow::OnSysColourChanged(event
);
247 void wxPreviewCanvas::OnChar(wxKeyEvent
&event
)
249 wxPreviewControlBar
* controlBar
= ((wxPreviewFrame
*) GetParent())->GetControlBar();
250 if (event
.GetKeyCode() == WXK_ESCAPE
)
252 ((wxPreviewFrame
*) GetParent())->Close(true);
255 else if (event
.GetKeyCode() == WXK_TAB
)
257 controlBar
->OnGoto();
260 else if (event
.GetKeyCode() == WXK_RETURN
)
262 controlBar
->OnPrint();
266 if (!event
.ControlDown())
272 switch(event
.GetKeyCode())
275 controlBar
->OnNext(); break;
277 controlBar
->OnPrevious(); break;
279 controlBar
->OnFirst(); break;
281 controlBar
->OnLast(); break;
288 * Preview control bar
291 BEGIN_EVENT_TABLE(wxPreviewControlBar
, wxPanel
)
292 EVT_BUTTON(wxID_PREVIEW_CLOSE
, wxPreviewControlBar::OnWindowClose
)
293 EVT_BUTTON(wxID_PREVIEW_PRINT
, wxPreviewControlBar::OnPrintButton
)
294 EVT_BUTTON(wxID_PREVIEW_PREVIOUS
, wxPreviewControlBar::OnPreviousButton
)
295 EVT_BUTTON(wxID_PREVIEW_NEXT
, wxPreviewControlBar::OnNextButton
)
296 EVT_BUTTON(wxID_PREVIEW_FIRST
, wxPreviewControlBar::OnFirstButton
)
297 EVT_BUTTON(wxID_PREVIEW_LAST
, wxPreviewControlBar::OnLastButton
)
298 EVT_BUTTON(wxID_PREVIEW_GOTO
, wxPreviewControlBar::OnGotoButton
)
299 EVT_CHOICE(wxID_PREVIEW_ZOOM
, wxPreviewControlBar::OnZoom
)
300 EVT_PAINT(wxPreviewControlBar::OnPaint
)
303 wxPreviewControlBar::wxPreviewControlBar(wxPrintPreviewBase
*preview
, long buttons
,
304 wxWindow
*parent
, const wxPoint
& pos
, const wxSize
& size
,
305 long style
, const wxString
& name
):
306 wxPanel(parent
, wxID_ANY
, pos
, size
, style
, name
)
308 m_printPreview
= preview
;
309 m_closeButton
= (wxButton
*) NULL
;
310 m_nextPageButton
= (wxButton
*) NULL
;
311 m_previousPageButton
= (wxButton
*) NULL
;
312 m_printButton
= (wxButton
*) NULL
;
313 m_zoomControl
= (wxChoice
*) NULL
;
314 m_buttonFlags
= buttons
;
317 wxPreviewControlBar::~wxPreviewControlBar()
321 void wxPreviewControlBar::OnPaint(wxPaintEvent
& WXUNUSED(event
))
327 dc
.SetPen(*wxBLACK_PEN
);
328 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
329 dc
.DrawLine( 0, h
-1, w
, h
-1 );
332 void wxPreviewControlBar::OnWindowClose(wxCommandEvent
& WXUNUSED(event
))
334 wxPreviewFrame
*frame
= (wxPreviewFrame
*)GetParent();
338 void wxPreviewControlBar::OnPrint(void)
340 wxPrintPreviewBase
*preview
= GetPrintPreview();
341 preview
->Print(true);
344 void wxPreviewControlBar::OnNext(void)
346 wxPrintPreviewBase
*preview
= GetPrintPreview();
349 int currentPage
= preview
->GetCurrentPage();
350 if ((preview
->GetMaxPage() > 0) &&
351 (currentPage
< preview
->GetMaxPage()) &&
352 preview
->GetPrintout()->HasPage(currentPage
+ 1))
354 preview
->SetCurrentPage(currentPage
+ 1);
359 void wxPreviewControlBar::OnPrevious(void)
361 wxPrintPreviewBase
*preview
= GetPrintPreview();
364 int currentPage
= preview
->GetCurrentPage();
365 if ((preview
->GetMinPage() > 0) &&
366 (currentPage
> preview
->GetMinPage()) &&
367 preview
->GetPrintout()->HasPage(currentPage
- 1))
369 preview
->SetCurrentPage(currentPage
- 1);
374 void wxPreviewControlBar::OnFirst(void)
376 wxPrintPreviewBase
*preview
= GetPrintPreview();
379 int currentPage
= preview
->GetMinPage();
380 if (preview
->GetPrintout()->HasPage(currentPage
))
382 preview
->SetCurrentPage(currentPage
);
387 void wxPreviewControlBar::OnLast(void)
389 wxPrintPreviewBase
*preview
= GetPrintPreview();
392 int currentPage
= preview
->GetMaxPage();
393 if (preview
->GetPrintout()->HasPage(currentPage
))
395 preview
->SetCurrentPage(currentPage
);
400 void wxPreviewControlBar::OnGoto(void)
402 wxPrintPreviewBase
*preview
= GetPrintPreview();
407 if (preview
->GetMinPage() > 0)
412 strPrompt
.Printf( _("Enter a page number between %d and %d:"),
413 preview
->GetMinPage(), preview
->GetMaxPage());
414 strPage
.Printf( wxT("%d"), preview
->GetCurrentPage() );
417 wxGetTextFromUser( strPrompt
, _("Goto Page"), strPage
, GetParent());
419 if ( strPage
.ToLong( ¤tPage
) )
420 if (preview
->GetPrintout()->HasPage(currentPage
))
422 preview
->SetCurrentPage(currentPage
);
428 void wxPreviewControlBar::OnZoom(wxCommandEvent
& WXUNUSED(event
))
430 int zoom
= GetZoomControl();
431 if (GetPrintPreview())
432 GetPrintPreview()->SetZoom(zoom
);
435 void wxPreviewControlBar::CreateButtons()
437 SetSize(0, 0, 400, 40);
439 wxBoxSizer
*item0
= new wxBoxSizer( wxHORIZONTAL
);
441 m_closeButton
= new wxButton( this, wxID_PREVIEW_CLOSE
, _("&Close"), wxDefaultPosition
, wxDefaultSize
, 0 );
442 item0
->Add( m_closeButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
444 if (m_buttonFlags
& wxPREVIEW_PRINT
)
446 m_printButton
= new wxButton( this, wxID_PREVIEW_PRINT
, _("&Print..."), wxDefaultPosition
, wxDefaultSize
, 0 );
447 item0
->Add( m_printButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
450 if (m_buttonFlags
& wxPREVIEW_FIRST
)
452 m_firstPageButton
= new wxButton( this, wxID_PREVIEW_FIRST
, _("|<<"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
453 item0
->Add( m_firstPageButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
456 if (m_buttonFlags
& wxPREVIEW_PREVIOUS
)
458 m_previousPageButton
= new wxButton( this, wxID_PREVIEW_PREVIOUS
, _("<<"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
459 item0
->Add( m_previousPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 );
462 if (m_buttonFlags
& wxPREVIEW_NEXT
)
464 m_nextPageButton
= new wxButton( this, wxID_PREVIEW_NEXT
, _(">>"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
465 item0
->Add( m_nextPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 );
468 if (m_buttonFlags
& wxPREVIEW_LAST
)
470 m_lastPageButton
= new wxButton( this, wxID_PREVIEW_LAST
, _(">>|"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
471 item0
->Add( m_lastPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 );
474 if (m_buttonFlags
& wxPREVIEW_GOTO
)
476 m_gotoPageButton
= new wxButton( this, wxID_PREVIEW_GOTO
, _("&Goto..."), wxDefaultPosition
, wxDefaultSize
, 0 );
477 item0
->Add( m_gotoPageButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
480 if (m_buttonFlags
& wxPREVIEW_ZOOM
)
484 wxT("10%"), wxT("15%"), wxT("20%"), wxT("25%"), wxT("30%"), wxT("35%"), wxT("40%"), wxT("45%"), wxT("50%"), wxT("55%"),
485 wxT("60%"), wxT("65%"), wxT("70%"), wxT("75%"), wxT("80%"), wxT("85%"), wxT("90%"), wxT("95%"), wxT("100%"), wxT("110%"),
486 wxT("120%"), wxT("150%"), wxT("200%")
488 int n
= WXSIZEOF(choices
);
490 m_zoomControl
= new wxChoice( this, wxID_PREVIEW_ZOOM
, wxDefaultPosition
, wxSize(70,wxDefaultCoord
), n
, choices
, 0 );
491 item0
->Add( m_zoomControl
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
492 SetZoomControl(m_printPreview
->GetZoom());
499 void wxPreviewControlBar::SetZoomControl(int zoom
)
503 int n
, count
= m_zoomControl
->GetCount();
505 for (n
=0; n
<count
; n
++)
507 if (m_zoomControl
->GetString(n
).BeforeFirst(wxT('%')).ToLong(&val
) &&
510 m_zoomControl
->SetSelection(n
);
515 m_zoomControl
->SetSelection(count
-1);
519 int wxPreviewControlBar::GetZoomControl()
521 if (m_zoomControl
&& (m_zoomControl
->GetStringSelection() != wxEmptyString
))
524 if (m_zoomControl
->GetStringSelection().BeforeFirst(wxT('%')).ToLong(&val
))
536 BEGIN_EVENT_TABLE(wxPreviewFrame
, wxFrame
)
537 EVT_CLOSE(wxPreviewFrame::OnCloseWindow
)
540 wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase
*preview
, wxWindow
*parent
, const wxString
& title
,
541 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
):
542 wxFrame(parent
, wxID_ANY
, title
, pos
, size
, style
, name
)
544 m_printPreview
= preview
;
546 m_previewCanvas
= NULL
;
547 m_windowDisabler
= NULL
;
549 // Give the application icon
551 wxFrame
* topFrame
= wxDynamicCast(wxTheApp
->GetTopWindow(), wxFrame
);
553 SetIcon(topFrame
->GetIcon());
557 wxPreviewFrame::~wxPreviewFrame()
561 void wxPreviewFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
563 if (m_windowDisabler
)
564 delete m_windowDisabler
;
566 // Need to delete the printout and the print preview
567 wxPrintout
*printout
= m_printPreview
->GetPrintout();
571 m_printPreview
->SetPrintout(NULL
);
572 m_printPreview
->SetCanvas(NULL
);
573 m_printPreview
->SetFrame(NULL
);
575 delete m_printPreview
;
580 void wxPreviewFrame::Initialize()
588 m_printPreview
->SetCanvas(m_previewCanvas
);
589 m_printPreview
->SetFrame(this);
591 wxBoxSizer
*item0
= new wxBoxSizer( wxVERTICAL
);
593 item0
->Add( m_controlBar
, 0, wxGROW
|wxALIGN_CENTER_VERTICAL
, 5 );
594 item0
->Add( m_previewCanvas
, 1, wxGROW
|wxALIGN_CENTER_VERTICAL
, 5 );
596 SetAutoLayout( true );
599 m_windowDisabler
= new wxWindowDisabler(this);
603 m_printPreview
->AdjustScrollbars(m_previewCanvas
);
604 m_previewCanvas
->SetFocus();
605 m_controlBar
->SetFocus();
608 void wxPreviewFrame::CreateCanvas()
610 m_previewCanvas
= new wxPreviewCanvas(m_printPreview
, this);
613 void wxPreviewFrame::CreateControlBar()
615 long buttons
= wxPREVIEW_DEFAULT
;
616 if (m_printPreview
->GetPrintoutForPrinting())
617 buttons
|= wxPREVIEW_PRINT
;
619 m_controlBar
= new wxPreviewControlBar(m_printPreview
, buttons
, this, wxPoint(0, 0), wxSize(400, 40));
620 m_controlBar
->CreateButtons();
627 wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout
*printout
,
628 wxPrintout
*printoutForPrinting
,
632 m_printDialogData
= (*data
);
634 Init(printout
, printoutForPrinting
);
637 wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout
*printout
,
638 wxPrintout
*printoutForPrinting
,
639 wxPrintDialogData
*data
)
642 m_printDialogData
= (*data
);
644 Init(printout
, printoutForPrinting
);
647 void wxPrintPreviewBase::Init(wxPrintout
*printout
,
648 wxPrintout
*printoutForPrinting
)
651 m_previewPrintout
= printout
;
652 if (m_previewPrintout
)
653 m_previewPrintout
->SetIsPreview(true);
655 m_printPrintout
= printoutForPrinting
;
657 m_previewCanvas
= NULL
;
658 m_previewFrame
= NULL
;
659 m_previewBitmap
= NULL
;
666 m_printingPrepared
= false;
671 wxPrintPreviewBase::~wxPrintPreviewBase()
673 if (m_previewPrintout
)
674 delete m_previewPrintout
;
676 delete m_previewBitmap
;
678 delete m_printPrintout
;
681 bool wxPrintPreviewBase::SetCurrentPage(int pageNum
)
683 if (m_currentPage
== pageNum
)
686 m_currentPage
= pageNum
;
689 delete m_previewBitmap
;
690 m_previewBitmap
= NULL
;
695 AdjustScrollbars(m_previewCanvas
);
697 if (!RenderPage(pageNum
))
699 m_previewCanvas
->Refresh();
700 m_previewCanvas
->SetFocus();
705 bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas
*canvas
, wxDC
& dc
)
707 DrawBlankPage(canvas
, dc
);
709 if (!m_previewBitmap
)
710 if (!RenderPage(m_currentPage
))
713 if (!m_previewBitmap
)
719 int canvasWidth
, canvasHeight
;
720 canvas
->GetSize(&canvasWidth
, &canvasHeight
);
722 double zoomScale
= ((float)m_currentZoom
/(float)100);
723 double actualWidth
= (zoomScale
*m_pageWidth
*m_previewScale
);
724 // float actualHeight = (float)(zoomScale*m_pageHeight*m_previewScale);
726 int x
= (int) ((canvasWidth
- actualWidth
)/2.0);
727 if (x
< m_leftMargin
)
732 temp_dc
.SelectObject(*m_previewBitmap
);
734 dc
.Blit(x
, y
, m_previewBitmap
->GetWidth(), m_previewBitmap
->GetHeight(), &temp_dc
, 0, 0);
736 temp_dc
.SelectObject(wxNullBitmap
);
741 // Adjusts the scrollbars for the current scale
742 void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas
*canvas
)
747 int canvasWidth
, canvasHeight
;
748 canvas
->GetSize(&canvasWidth
, &canvasHeight
);
750 double zoomScale
= ((float)m_currentZoom
/(float)100);
751 double actualWidth
= (zoomScale
*m_pageWidth
*m_previewScale
);
752 double actualHeight
= (zoomScale
*m_pageHeight
*m_previewScale
);
754 // Set the scrollbars appropriately
755 int totalWidth
= (int)(actualWidth
+ 2*m_leftMargin
);
756 int totalHeight
= (int)(actualHeight
+ 2*m_topMargin
);
757 int scrollUnitsX
= totalWidth
/10;
758 int scrollUnitsY
= totalHeight
/10;
759 wxSize virtualSize
= canvas
->GetVirtualSize();
760 if (virtualSize
.GetWidth() != totalWidth
|| virtualSize
.GetHeight() != totalHeight
)
761 canvas
->SetScrollbars(10, 10, scrollUnitsX
, scrollUnitsY
, 0, 0, true);
764 bool wxPrintPreviewBase::RenderPage(int pageNum
)
768 int canvasWidth
, canvasHeight
;
770 if (!m_previewCanvas
)
772 wxFAIL_MSG(_T("wxPrintPreviewBase::RenderPage: must use wxPrintPreviewBase::SetCanvas to let me know about the canvas!"));
776 m_previewCanvas
->GetSize(&canvasWidth
, &canvasHeight
);
778 double zoomScale
= (m_currentZoom
/100.0);
779 int actualWidth
= (int)(zoomScale
*m_pageWidth
*m_previewScale
);
780 int actualHeight
= (int)(zoomScale
*m_pageHeight
*m_previewScale
);
782 if (!m_previewBitmap
)
784 m_previewBitmap
= new wxBitmap((int)actualWidth
, (int)actualHeight
);
785 if (!m_previewBitmap
|| !m_previewBitmap
->Ok())
787 if (m_previewBitmap
) {
788 delete m_previewBitmap
;
789 m_previewBitmap
= NULL
;
791 wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK
);
797 memoryDC
.SelectObject(*m_previewBitmap
);
801 m_previewPrintout
->SetDC(&memoryDC
);
802 m_previewPrintout
->SetPageSizePixels(m_pageWidth
, m_pageHeight
);
804 // Need to delay OnPreparePrinting until here, so we have enough information.
805 if (!m_printingPrepared
)
807 m_previewPrintout
->OnPreparePrinting();
809 m_previewPrintout
->GetPageInfo(&m_minPage
, &m_maxPage
, &selFrom
, &selTo
);
810 m_printingPrepared
= true;
813 m_previewPrintout
->OnBeginPrinting();
815 if (!m_previewPrintout
->OnBeginDocument(m_printDialogData
.GetFromPage(), m_printDialogData
.GetToPage()))
817 wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK
);
819 memoryDC
.SelectObject(wxNullBitmap
);
821 delete m_previewBitmap
;
822 m_previewBitmap
= NULL
;
826 m_previewPrintout
->OnPrintPage(pageNum
);
827 m_previewPrintout
->OnEndDocument();
828 m_previewPrintout
->OnEndPrinting();
830 m_previewPrintout
->SetDC(NULL
);
832 memoryDC
.SelectObject(wxNullBitmap
);
837 status
= wxString::Format(_("Page %d of %d"), pageNum
, m_maxPage
);
839 status
= wxString::Format(_("Page %d"), pageNum
);
842 m_previewFrame
->SetStatusText(status
);
849 bool wxPrintPreviewBase::DrawBlankPage(wxPreviewCanvas
*canvas
, wxDC
& dc
)
851 int canvasWidth
, canvasHeight
;
852 canvas
->GetSize(&canvasWidth
, &canvasHeight
);
854 float zoomScale
= (float)((float)m_currentZoom
/(float)100);
855 float actualWidth
= zoomScale
*m_pageWidth
*m_previewScale
;
856 float actualHeight
= zoomScale
*m_pageHeight
*m_previewScale
;
858 float x
= (float)((canvasWidth
- actualWidth
)/2.0);
859 if (x
< m_leftMargin
)
860 x
= (float)m_leftMargin
;
861 float y
= (float)m_topMargin
;
863 // Draw shadow, allowing for 1-pixel border AROUND the actual page
864 int shadowOffset
= 4;
865 dc
.SetPen(*wxBLACK_PEN
);
866 dc
.SetBrush(*wxBLACK_BRUSH
);
868 dc.DrawRectangle((int)(x-1 + shadowOffset), (int)(y-1 + shadowOffset), (int)(actualWidth+2), (int)(actualHeight+2));
870 dc
.DrawRectangle((int)(x
+ shadowOffset
), (int)(y
+ actualHeight
+1), (int)(actualWidth
), shadowOffset
);
871 dc
.DrawRectangle((int)(x
+ actualWidth
), (int)(y
+ shadowOffset
), shadowOffset
, (int)(actualHeight
));
873 // Draw blank page allowing for 1-pixel border AROUND the actual page
874 dc
.SetPen(*wxBLACK_PEN
);
875 dc
.SetBrush(*wxWHITE_BRUSH
);
878 wxRegion update_region = canvas->GetUpdateRegion();
879 wxRect r = update_region.GetBox();
881 printf( "x: %d y: %d w: %d h: %d.\n", (int)r.x, (int)r.y, (int)r.width, (int)r.height );
884 dc
.DrawRectangle((int)(x
-2), (int)(y
-1), (int)(actualWidth
+3), (int)(actualHeight
+2));
889 void wxPrintPreviewBase::SetZoom(int percent
)
891 if (m_currentZoom
== percent
)
894 m_currentZoom
= percent
;
897 delete m_previewBitmap
;
898 m_previewBitmap
= NULL
;
903 AdjustScrollbars(m_previewCanvas
);
904 RenderPage(m_currentPage
);
905 ((wxScrolledWindow
*) m_previewCanvas
)->Scroll(0, 0);
906 m_previewCanvas
->ClearBackground();
907 m_previewCanvas
->Refresh();
908 m_previewCanvas
->SetFocus();
912 #endif // wxUSE_PRINTING_ARCHITECTURE