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"
14 #pragma implementation "printdlg.h"
17 // For compilers that support precompilation, includes "wx.h".
18 #include "wx/wxprec.h"
26 #if wxUSE_PRINTING_ARCHITECTURE
32 #include "wx/msgdlg.h"
33 #include "wx/layout.h"
34 #include "wx/choice.h"
35 #include "wx/button.h"
36 #include "wx/settings.h"
37 #include "wx/dcmemory.h"
38 #include "wx/stattext.h"
40 #include "wx/textdlg.h"
44 #include "wx/prntbase.h"
45 #include "wx/dcprint.h"
46 #include "wx/printdlg.h"
48 #include "wx/module.h"
53 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
54 #include "wx/msw/printdlg.h"
55 #elif defined(__WXMAC__)
56 #include "wx/mac/printdlg.h"
57 #include "wx/mac/private/print.h"
59 #include "wx/generic/prntdlgg.h"
63 #include "wx/msw/wrapcdlg.h"
69 //----------------------------------------------------------------------------
71 //----------------------------------------------------------------------------
73 wxPrintFactory
*wxPrintFactory::m_factory
= NULL
;
75 void wxPrintFactory::SetPrintFactory( wxPrintFactory
*factory
)
77 if (wxPrintFactory::m_factory
)
78 delete wxPrintFactory::m_factory
;
80 wxPrintFactory::m_factory
= factory
;
83 wxPrintFactory
*wxPrintFactory::GetFactory()
85 if (!wxPrintFactory::m_factory
)
86 wxPrintFactory::m_factory
= new wxNativePrintFactory
;
88 return wxPrintFactory::m_factory
;
91 //----------------------------------------------------------------------------
92 // wxNativePrintFactory
93 //----------------------------------------------------------------------------
95 wxPrinterBase
*wxNativePrintFactory::CreatePrinter( wxPrintDialogData
*data
)
97 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
98 return new wxWindowsPrinter( data
);
99 #elif defined(__WXMAC__)
100 return new wxMacPrinter( data
);
101 #elif defined(__WXPM__)
102 return new wxOS2Printer( data
);
104 return new wxPostScriptPrinter( data
);
108 wxPrintPreviewBase
*wxNativePrintFactory::CreatePrintPreview( wxPrintout
*preview
,
109 wxPrintout
*printout
, wxPrintDialogData
*data
)
111 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
112 return new wxWindowsPrintPreview( preview
, printout
, data
);
113 #elif defined(__WXMAC__)
114 return new wxMacPrintPreview( preview
, printout
, data
);
115 #elif defined(__WXPM__)
116 return new wxOS2PrintPreview( preview
, printout
, data
);
118 return new wxPostScriptPrintPreview( preview
, printout
, data
);
122 wxPrintPreviewBase
*wxNativePrintFactory::CreatePrintPreview( wxPrintout
*preview
,
123 wxPrintout
*printout
, wxPrintData
*data
)
125 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
126 return new wxWindowsPrintPreview( preview
, printout
, data
);
127 #elif defined(__WXMAC__)
128 return new wxMacPrintPreview( preview
, printout
, data
);
129 #elif defined(__WXPM__)
130 return new wxOS2PrintPreview( preview
, printout
, data
);
132 return new wxPostScriptPrintPreview( preview
, printout
, data
);
136 wxPrintDialogBase
*wxNativePrintFactory::CreatePrintDialog( wxWindow
*parent
,
137 wxPrintDialogData
*data
)
139 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
140 return new wxWindowsPrintDialog( parent
, data
);
141 #elif defined(__WXMAC__)
142 return new wxMacPrintDialog( parent
, data
);
144 return new wxGenericPrintDialog( parent
, data
);
148 wxPrintDialogBase
*wxNativePrintFactory::CreatePrintDialog( wxWindow
*parent
,
151 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
152 return new wxWindowsPrintDialog( parent
, data
);
153 #elif defined(__WXMAC__)
154 return new wxMacPrintDialog( parent
, data
);
156 return new wxGenericPrintDialog( parent
, data
);
160 wxPageSetupDialogBase
*wxNativePrintFactory::CreatePageSetupDialog( wxWindow
*parent
,
161 wxPageSetupDialogData
*data
)
163 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
164 return new wxWindowsPageSetupDialog( parent
, data
);
165 #elif defined(__WXMAC__)
166 return new wxMacPageSetupDialog( parent
, data
);
168 return new wxGenericPageSetupDialog( parent
, data
);
172 bool wxNativePrintFactory::HasPrintSetupDialog()
174 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
176 #elif defined(__WXMAC__)
179 // Only here do we need to provide the print setup
180 // dialog ourselves, the other platforms either have
181 // none, don't make it accessible or let you configure
182 // the printer from the wxPrintDialog anyway.
188 wxDialog
*wxNativePrintFactory::CreatePrintSetupDialog( wxWindow
*parent
,
191 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
195 #elif defined(__WXMAC__)
200 // Only here do we need to provide the print setup
201 // dialog ourselves, the other platforms either have
202 // none, don't make it accessible or let you configure
203 // the printer from the wxPrintDialog anyway.
204 return new wxGenericPrintSetupDialog( parent
, data
);
208 bool wxNativePrintFactory::HasOwnPrintToFile()
210 // Only relevant for PostScript and here the
211 // setup dialog provides no "print to file"
212 // option. In the GNOME setup dialog, the
213 // setup dialog has its own print to file.
217 bool wxNativePrintFactory::HasPrinterLine()
219 // Only relevant for PostScript for now
223 wxString
wxNativePrintFactory::CreatePrinterLine()
225 // Only relevant for PostScript for now
227 // We should query "lpstat -d" here
228 return _("Generic PostScript");
231 bool wxNativePrintFactory::HasStatusLine()
233 // Only relevant for PostScript for now
237 wxString
wxNativePrintFactory::CreateStatusLine()
239 // Only relevant for PostScript for now
241 // We should query "lpstat -r" or "lpstat -p" here
245 wxPrintNativeDataBase
*wxNativePrintFactory::CreatePrintNativeData()
247 #if defined(__WXMSW__) && !defined(__WXUNIVERSAL__)
248 return new wxWindowsPrintNativeData
;
249 #elif defined(__WXMAC__)
250 return new wxMacCarbonPrintData
;
252 return new wxPostScriptPrintNativeData
;
256 //----------------------------------------------------------------------------
257 // wxPrintNativeDataBase
258 //----------------------------------------------------------------------------
260 IMPLEMENT_ABSTRACT_CLASS(wxPrintNativeDataBase
, wxObject
)
262 wxPrintNativeDataBase::wxPrintNativeDataBase()
267 //----------------------------------------------------------------------------
268 // wxPrintFactoryModule
269 //----------------------------------------------------------------------------
271 class wxPrintFactoryModule
: public wxModule
274 wxPrintFactoryModule() {}
275 bool OnInit() { return true; }
276 void OnExit() { wxPrintFactory::SetPrintFactory( NULL
); }
279 DECLARE_DYNAMIC_CLASS(wxPrintFactoryModule
)
282 IMPLEMENT_DYNAMIC_CLASS(wxPrintFactoryModule
, wxModule
)
284 //----------------------------------------------------------------------------
286 //----------------------------------------------------------------------------
288 IMPLEMENT_CLASS(wxPrinterBase
, wxObject
)
290 wxPrinterBase::wxPrinterBase(wxPrintDialogData
*data
)
292 m_currentPrintout
= (wxPrintout
*) NULL
;
293 sm_abortWindow
= (wxWindow
*) NULL
;
296 m_printDialogData
= (*data
);
297 sm_lastError
= wxPRINTER_NO_ERROR
;
300 wxWindow
*wxPrinterBase::sm_abortWindow
= (wxWindow
*) NULL
;
301 bool wxPrinterBase::sm_abortIt
= false;
302 wxPrinterError
wxPrinterBase::sm_lastError
= wxPRINTER_NO_ERROR
;
304 wxPrinterBase::~wxPrinterBase()
308 wxWindow
*wxPrinterBase::CreateAbortWindow(wxWindow
*parent
, wxPrintout
* printout
)
310 wxPrintAbortDialog
*dialog
= new wxPrintAbortDialog(parent
, _("Printing ") , wxDefaultPosition
, wxDefaultSize
, wxDEFAULT_DIALOG_STYLE
);
312 wxBoxSizer
*button_sizer
= new wxBoxSizer( wxVERTICAL
);
313 button_sizer
->Add( new wxStaticText(dialog
, wxID_ANY
, _("Please wait while printing\n") + printout
->GetTitle() ), 0, wxALL
, 10 );
314 button_sizer
->Add( new wxButton( dialog
, wxID_CANCEL
, wxT("Cancel") ), 0, wxALL
| wxALIGN_CENTER
, 10 );
316 dialog
->SetAutoLayout( true );
317 dialog
->SetSizer( button_sizer
);
319 button_sizer
->Fit(dialog
);
320 button_sizer
->SetSizeHints (dialog
) ;
325 void wxPrinterBase::ReportError(wxWindow
*parent
, wxPrintout
*WXUNUSED(printout
), const wxString
& message
)
327 wxMessageBox(message
, _("Printing Error"), wxOK
, parent
);
330 wxPrintDialogData
& wxPrinterBase::GetPrintDialogData() const
332 return (wxPrintDialogData
&) m_printDialogData
;
335 //----------------------------------------------------------------------------
337 //----------------------------------------------------------------------------
339 IMPLEMENT_CLASS(wxPrinter
, wxPrinterBase
)
341 wxPrinter::wxPrinter(wxPrintDialogData
*data
)
343 m_pimpl
= wxPrintFactory::GetFactory()->CreatePrinter( data
);
346 wxPrinter::~wxPrinter()
351 wxWindow
*wxPrinter::CreateAbortWindow(wxWindow
*parent
, wxPrintout
*printout
)
353 return m_pimpl
->CreateAbortWindow( parent
, printout
);
356 void wxPrinter::ReportError(wxWindow
*parent
, wxPrintout
*printout
, const wxString
& message
)
358 m_pimpl
->ReportError( parent
, printout
, message
);
361 bool wxPrinter::Setup(wxWindow
*parent
)
363 return m_pimpl
->Setup( parent
);
366 bool wxPrinter::Print(wxWindow
*parent
, wxPrintout
*printout
, bool prompt
)
368 return m_pimpl
->Print( parent
, printout
, prompt
);
371 wxDC
* wxPrinter::PrintDialog(wxWindow
*parent
)
373 return m_pimpl
->PrintDialog( parent
);
376 wxPrintDialogData
& wxPrinter::GetPrintDialogData() const
378 return m_pimpl
->GetPrintDialogData();
381 // ---------------------------------------------------------------------------
382 // wxPrintDialogBase: the dialog for printing.
383 // ---------------------------------------------------------------------------
385 IMPLEMENT_ABSTRACT_CLASS(wxPrintDialogBase
, wxDialog
)
387 wxPrintDialogBase::wxPrintDialogBase(wxWindow
*parent
,
389 const wxString
&title
,
393 : wxDialog( parent
, id
, title
.empty() ? wxString(_("Print")) : title
,
398 // ---------------------------------------------------------------------------
399 // wxPrintDialog: the dialog for printing
400 // ---------------------------------------------------------------------------
402 IMPLEMENT_CLASS(wxPrintDialog
, wxObject
)
404 wxPrintDialog::wxPrintDialog(wxWindow
*parent
, wxPrintDialogData
* data
)
406 m_pimpl
= wxPrintFactory::GetFactory()->CreatePrintDialog( parent
, data
);
409 wxPrintDialog::wxPrintDialog(wxWindow
*parent
, wxPrintData
* data
)
411 m_pimpl
= wxPrintFactory::GetFactory()->CreatePrintDialog( parent
, data
);
414 wxPrintDialog::~wxPrintDialog()
419 int wxPrintDialog::ShowModal()
421 return m_pimpl
->ShowModal();
424 wxPrintDialogData
& wxPrintDialog::GetPrintDialogData()
426 return m_pimpl
->GetPrintDialogData();
429 wxPrintData
& wxPrintDialog::GetPrintData()
431 return m_pimpl
->GetPrintData();
434 wxDC
*wxPrintDialog::GetPrintDC()
436 return m_pimpl
->GetPrintDC();
439 // ---------------------------------------------------------------------------
440 // wxPageSetupDialogBase: the page setup dialog
441 // ---------------------------------------------------------------------------
443 IMPLEMENT_ABSTRACT_CLASS(wxPageSetupDialogBase
, wxDialog
)
445 wxPageSetupDialogBase::wxPageSetupDialogBase(wxWindow
*parent
,
447 const wxString
&title
,
451 : wxDialog( parent
, id
, title
.empty() ? wxString(_("Page setup")) : title
,
456 // ---------------------------------------------------------------------------
457 // wxPageSetupDialog: the page setup dialog
458 // ---------------------------------------------------------------------------
460 IMPLEMENT_CLASS(wxPageSetupDialog
, wxObject
)
462 wxPageSetupDialog::wxPageSetupDialog(wxWindow
*parent
, wxPageSetupDialogData
*data
)
464 m_pimpl
= wxPrintFactory::GetFactory()->CreatePageSetupDialog( parent
, data
);
467 wxPageSetupDialog::~wxPageSetupDialog()
472 int wxPageSetupDialog::ShowModal()
474 return m_pimpl
->ShowModal();
477 wxPageSetupDialogData
& wxPageSetupDialog::GetPageSetupDialogData()
479 return m_pimpl
->GetPageSetupDialogData();
483 wxPageSetupDialogData
& wxPageSetupDialog::GetPageSetupData()
485 return m_pimpl
->GetPageSetupDialogData();
488 //----------------------------------------------------------------------------
489 // wxPrintAbortDialog
490 //----------------------------------------------------------------------------
492 BEGIN_EVENT_TABLE(wxPrintAbortDialog
, wxDialog
)
493 EVT_BUTTON(wxID_CANCEL
, wxPrintAbortDialog::OnCancel
)
496 void wxPrintAbortDialog::OnCancel(wxCommandEvent
& WXUNUSED(event
))
498 wxPrinterBase::sm_abortIt
= true;
499 wxPrinterBase::sm_abortWindow
->Show(false);
500 wxPrinterBase::sm_abortWindow
->Close(true);
501 wxPrinterBase::sm_abortWindow
= (wxWindow
*) NULL
;
504 //----------------------------------------------------------------------------
506 //----------------------------------------------------------------------------
508 IMPLEMENT_ABSTRACT_CLASS(wxPrintout
, wxObject
)
510 wxPrintout::wxPrintout(const wxString
& title
)
512 m_printoutTitle
= title
;
513 m_printoutDC
= (wxDC
*) NULL
;
516 m_pageWidthPixels
= 0;
517 m_pageHeightPixels
= 0;
525 wxPrintout::~wxPrintout()
529 bool wxPrintout::OnBeginDocument(int WXUNUSED(startPage
), int WXUNUSED(endPage
))
531 return GetDC()->StartDoc(_("Printing ") + m_printoutTitle
);
534 void wxPrintout::OnEndDocument()
539 void wxPrintout::OnBeginPrinting()
543 void wxPrintout::OnEndPrinting()
547 bool wxPrintout::HasPage(int page
)
552 void wxPrintout::GetPageInfo(int *minPage
, int *maxPage
, int *fromPage
, int *toPage
)
560 //----------------------------------------------------------------------------
562 //----------------------------------------------------------------------------
564 IMPLEMENT_CLASS(wxPreviewCanvas
, wxWindow
)
566 BEGIN_EVENT_TABLE(wxPreviewCanvas
, wxScrolledWindow
)
567 EVT_PAINT(wxPreviewCanvas::OnPaint
)
568 EVT_CHAR(wxPreviewCanvas::OnChar
)
569 EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged
)
572 // VZ: the current code doesn't refresh properly without
573 // wxFULL_REPAINT_ON_RESIZE, this must be fixed as otherwise we have
574 // really horrible flicker when resizing the preview frame, but without
575 // this style it simply doesn't work correctly at all...
576 wxPreviewCanvas::wxPreviewCanvas(wxPrintPreviewBase
*preview
, wxWindow
*parent
,
577 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
):
578 wxScrolledWindow(parent
, wxID_ANY
, pos
, size
, style
| wxFULL_REPAINT_ON_RESIZE
, name
)
580 m_printPreview
= preview
;
582 // The app workspace colour is always white, but we should have
583 // a contrast with the page.
584 wxSystemColour colourIndex
= wxSYS_COLOUR_3DDKSHADOW
;
586 wxSystemColour colourIndex
= wxSYS_COLOUR_APPWORKSPACE
;
588 SetBackgroundColour(wxSystemSettings::GetColour(colourIndex
));
590 SetScrollbars(10, 10, 100, 100);
593 wxPreviewCanvas::~wxPreviewCanvas()
597 void wxPreviewCanvas::OnPaint(wxPaintEvent
& WXUNUSED(event
))
604 if (!GetUpdateRegion().IsEmpty())
605 dc.SetClippingRegion( GetUpdateRegion() );
611 m_printPreview
->PaintPage(this, dc
);
615 // Responds to colour changes, and passes event on to children.
616 void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent
& event
)
619 // The app workspace colour is always white, but we should have
620 // a contrast with the page.
621 wxSystemColour colourIndex
= wxSYS_COLOUR_3DDKSHADOW
;
623 wxSystemColour colourIndex
= wxSYS_COLOUR_APPWORKSPACE
;
625 SetBackgroundColour(wxSystemSettings::GetColour(colourIndex
));
628 // Propagate the event to the non-top-level children
629 wxWindow::OnSysColourChanged(event
);
632 void wxPreviewCanvas::OnChar(wxKeyEvent
&event
)
634 wxPreviewControlBar
* controlBar
= ((wxPreviewFrame
*) GetParent())->GetControlBar();
635 if (event
.GetKeyCode() == WXK_ESCAPE
)
637 ((wxPreviewFrame
*) GetParent())->Close(true);
640 else if (event
.GetKeyCode() == WXK_TAB
)
642 controlBar
->OnGoto();
645 else if (event
.GetKeyCode() == WXK_RETURN
)
647 controlBar
->OnPrint();
651 if (!event
.ControlDown())
657 switch(event
.GetKeyCode())
660 controlBar
->OnNext(); break;
662 controlBar
->OnPrevious(); break;
664 controlBar
->OnFirst(); break;
666 controlBar
->OnLast(); break;
672 //----------------------------------------------------------------------------
673 // wxPreviewControlBar
674 //----------------------------------------------------------------------------
676 IMPLEMENT_CLASS(wxPreviewControlBar
, wxWindow
)
678 BEGIN_EVENT_TABLE(wxPreviewControlBar
, wxPanel
)
679 EVT_BUTTON(wxID_PREVIEW_CLOSE
, wxPreviewControlBar::OnWindowClose
)
680 EVT_BUTTON(wxID_PREVIEW_PRINT
, wxPreviewControlBar::OnPrintButton
)
681 EVT_BUTTON(wxID_PREVIEW_PREVIOUS
, wxPreviewControlBar::OnPreviousButton
)
682 EVT_BUTTON(wxID_PREVIEW_NEXT
, wxPreviewControlBar::OnNextButton
)
683 EVT_BUTTON(wxID_PREVIEW_FIRST
, wxPreviewControlBar::OnFirstButton
)
684 EVT_BUTTON(wxID_PREVIEW_LAST
, wxPreviewControlBar::OnLastButton
)
685 EVT_BUTTON(wxID_PREVIEW_GOTO
, wxPreviewControlBar::OnGotoButton
)
686 EVT_CHOICE(wxID_PREVIEW_ZOOM
, wxPreviewControlBar::OnZoom
)
687 EVT_PAINT(wxPreviewControlBar::OnPaint
)
690 wxPreviewControlBar::wxPreviewControlBar(wxPrintPreviewBase
*preview
, long buttons
,
691 wxWindow
*parent
, const wxPoint
& pos
, const wxSize
& size
,
692 long style
, const wxString
& name
):
693 wxPanel(parent
, wxID_ANY
, pos
, size
, style
, name
)
695 m_printPreview
= preview
;
696 m_closeButton
= (wxButton
*) NULL
;
697 m_nextPageButton
= (wxButton
*) NULL
;
698 m_previousPageButton
= (wxButton
*) NULL
;
699 m_printButton
= (wxButton
*) NULL
;
700 m_zoomControl
= (wxChoice
*) NULL
;
701 m_buttonFlags
= buttons
;
704 wxPreviewControlBar::~wxPreviewControlBar()
708 void wxPreviewControlBar::OnPaint(wxPaintEvent
& WXUNUSED(event
))
714 dc
.SetPen(*wxBLACK_PEN
);
715 dc
.SetBrush(*wxTRANSPARENT_BRUSH
);
716 dc
.DrawLine( 0, h
-1, w
, h
-1 );
719 void wxPreviewControlBar::OnWindowClose(wxCommandEvent
& WXUNUSED(event
))
721 wxPreviewFrame
*frame
= (wxPreviewFrame
*)GetParent();
725 void wxPreviewControlBar::OnPrint(void)
727 wxPrintPreviewBase
*preview
= GetPrintPreview();
728 preview
->Print(true);
731 void wxPreviewControlBar::OnNext(void)
733 wxPrintPreviewBase
*preview
= GetPrintPreview();
736 int currentPage
= preview
->GetCurrentPage();
737 if ((preview
->GetMaxPage() > 0) &&
738 (currentPage
< preview
->GetMaxPage()) &&
739 preview
->GetPrintout()->HasPage(currentPage
+ 1))
741 preview
->SetCurrentPage(currentPage
+ 1);
746 void wxPreviewControlBar::OnPrevious(void)
748 wxPrintPreviewBase
*preview
= GetPrintPreview();
751 int currentPage
= preview
->GetCurrentPage();
752 if ((preview
->GetMinPage() > 0) &&
753 (currentPage
> preview
->GetMinPage()) &&
754 preview
->GetPrintout()->HasPage(currentPage
- 1))
756 preview
->SetCurrentPage(currentPage
- 1);
761 void wxPreviewControlBar::OnFirst(void)
763 wxPrintPreviewBase
*preview
= GetPrintPreview();
766 int currentPage
= preview
->GetMinPage();
767 if (preview
->GetPrintout()->HasPage(currentPage
))
769 preview
->SetCurrentPage(currentPage
);
774 void wxPreviewControlBar::OnLast(void)
776 wxPrintPreviewBase
*preview
= GetPrintPreview();
779 int currentPage
= preview
->GetMaxPage();
780 if (preview
->GetPrintout()->HasPage(currentPage
))
782 preview
->SetCurrentPage(currentPage
);
787 void wxPreviewControlBar::OnGoto(void)
789 wxPrintPreviewBase
*preview
= GetPrintPreview();
794 if (preview
->GetMinPage() > 0)
799 strPrompt
.Printf( _("Enter a page number between %d and %d:"),
800 preview
->GetMinPage(), preview
->GetMaxPage());
801 strPage
.Printf( wxT("%d"), preview
->GetCurrentPage() );
804 wxGetTextFromUser( strPrompt
, _("Goto Page"), strPage
, GetParent());
806 if ( strPage
.ToLong( ¤tPage
) )
807 if (preview
->GetPrintout()->HasPage(currentPage
))
809 preview
->SetCurrentPage(currentPage
);
815 void wxPreviewControlBar::OnZoom(wxCommandEvent
& WXUNUSED(event
))
817 int zoom
= GetZoomControl();
818 if (GetPrintPreview())
819 GetPrintPreview()->SetZoom(zoom
);
822 void wxPreviewControlBar::CreateButtons()
824 SetSize(0, 0, 400, 40);
826 wxBoxSizer
*item0
= new wxBoxSizer( wxHORIZONTAL
);
828 m_closeButton
= new wxButton( this, wxID_PREVIEW_CLOSE
, _("&Close"), wxDefaultPosition
, wxDefaultSize
, 0 );
829 item0
->Add( m_closeButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
831 if (m_buttonFlags
& wxPREVIEW_PRINT
)
833 m_printButton
= new wxButton( this, wxID_PREVIEW_PRINT
, _("&Print..."), wxDefaultPosition
, wxDefaultSize
, 0 );
834 item0
->Add( m_printButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
837 if (m_buttonFlags
& wxPREVIEW_FIRST
)
839 m_firstPageButton
= new wxButton( this, wxID_PREVIEW_FIRST
, _("|<<"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
840 item0
->Add( m_firstPageButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
843 if (m_buttonFlags
& wxPREVIEW_PREVIOUS
)
845 m_previousPageButton
= new wxButton( this, wxID_PREVIEW_PREVIOUS
, _("<<"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
846 item0
->Add( m_previousPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 );
849 if (m_buttonFlags
& wxPREVIEW_NEXT
)
851 m_nextPageButton
= new wxButton( this, wxID_PREVIEW_NEXT
, _(">>"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
852 item0
->Add( m_nextPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 );
855 if (m_buttonFlags
& wxPREVIEW_LAST
)
857 m_lastPageButton
= new wxButton( this, wxID_PREVIEW_LAST
, _(">>|"), wxDefaultPosition
, wxDefaultSize
, wxBU_EXACTFIT
);
858 item0
->Add( m_lastPageButton
, 0, wxALIGN_CENTRE
|wxRIGHT
|wxTOP
|wxBOTTOM
, 5 );
861 if (m_buttonFlags
& wxPREVIEW_GOTO
)
863 m_gotoPageButton
= new wxButton( this, wxID_PREVIEW_GOTO
, _("&Goto..."), wxDefaultPosition
, wxDefaultSize
, 0 );
864 item0
->Add( m_gotoPageButton
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
867 if (m_buttonFlags
& wxPREVIEW_ZOOM
)
871 wxT("10%"), wxT("15%"), wxT("20%"), wxT("25%"), wxT("30%"), wxT("35%"), wxT("40%"), wxT("45%"), wxT("50%"), wxT("55%"),
872 wxT("60%"), wxT("65%"), wxT("70%"), wxT("75%"), wxT("80%"), wxT("85%"), wxT("90%"), wxT("95%"), wxT("100%"), wxT("110%"),
873 wxT("120%"), wxT("150%"), wxT("200%")
875 int n
= WXSIZEOF(choices
);
877 m_zoomControl
= new wxChoice( this, wxID_PREVIEW_ZOOM
, wxDefaultPosition
, wxSize(70,wxDefaultCoord
), n
, choices
, 0 );
878 item0
->Add( m_zoomControl
, 0, wxALIGN_CENTRE
|wxALL
, 5 );
879 SetZoomControl(m_printPreview
->GetZoom());
886 void wxPreviewControlBar::SetZoomControl(int zoom
)
890 int n
, count
= m_zoomControl
->GetCount();
892 for (n
=0; n
<count
; n
++)
894 if (m_zoomControl
->GetString(n
).BeforeFirst(wxT('%')).ToLong(&val
) &&
897 m_zoomControl
->SetSelection(n
);
902 m_zoomControl
->SetSelection(count
-1);
906 int wxPreviewControlBar::GetZoomControl()
908 if (m_zoomControl
&& (m_zoomControl
->GetStringSelection() != wxEmptyString
))
911 if (m_zoomControl
->GetStringSelection().BeforeFirst(wxT('%')).ToLong(&val
))
923 IMPLEMENT_CLASS(wxPreviewFrame
, wxFrame
)
925 BEGIN_EVENT_TABLE(wxPreviewFrame
, wxFrame
)
926 EVT_CLOSE(wxPreviewFrame::OnCloseWindow
)
929 wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase
*preview
, wxWindow
*parent
, const wxString
& title
,
930 const wxPoint
& pos
, const wxSize
& size
, long style
, const wxString
& name
):
931 wxFrame(parent
, wxID_ANY
, title
, pos
, size
, style
, name
)
933 m_printPreview
= preview
;
935 m_previewCanvas
= NULL
;
936 m_windowDisabler
= NULL
;
938 // Give the application icon
940 wxFrame
* topFrame
= wxDynamicCast(wxTheApp
->GetTopWindow(), wxFrame
);
942 SetIcon(topFrame
->GetIcon());
946 wxPreviewFrame::~wxPreviewFrame()
950 void wxPreviewFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
952 if (m_windowDisabler
)
953 delete m_windowDisabler
;
955 // Need to delete the printout and the print preview
956 wxPrintout
*printout
= m_printPreview
->GetPrintout();
960 m_printPreview
->SetPrintout(NULL
);
961 m_printPreview
->SetCanvas(NULL
);
962 m_printPreview
->SetFrame(NULL
);
964 delete m_printPreview
;
969 void wxPreviewFrame::Initialize()
977 m_printPreview
->SetCanvas(m_previewCanvas
);
978 m_printPreview
->SetFrame(this);
980 wxBoxSizer
*item0
= new wxBoxSizer( wxVERTICAL
);
982 item0
->Add( m_controlBar
, 0, wxGROW
|wxALIGN_CENTER_VERTICAL
, 5 );
983 item0
->Add( m_previewCanvas
, 1, wxGROW
|wxALIGN_CENTER_VERTICAL
, 5 );
985 SetAutoLayout( true );
988 m_windowDisabler
= new wxWindowDisabler(this);
992 m_printPreview
->AdjustScrollbars(m_previewCanvas
);
993 m_previewCanvas
->SetFocus();
994 m_controlBar
->SetFocus();
997 void wxPreviewFrame::CreateCanvas()
999 m_previewCanvas
= new wxPreviewCanvas(m_printPreview
, this);
1002 void wxPreviewFrame::CreateControlBar()
1004 long buttons
= wxPREVIEW_DEFAULT
;
1005 if (m_printPreview
->GetPrintoutForPrinting())
1006 buttons
|= wxPREVIEW_PRINT
;
1008 m_controlBar
= new wxPreviewControlBar(m_printPreview
, buttons
, this, wxPoint(0,0), wxSize(400, 40));
1009 m_controlBar
->CreateButtons();
1016 IMPLEMENT_CLASS(wxPrintPreviewBase
, wxObject
)
1018 wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout
*printout
,
1019 wxPrintout
*printoutForPrinting
,
1023 m_printDialogData
= (*data
);
1025 Init(printout
, printoutForPrinting
);
1028 wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout
*printout
,
1029 wxPrintout
*printoutForPrinting
,
1030 wxPrintDialogData
*data
)
1033 m_printDialogData
= (*data
);
1035 Init(printout
, printoutForPrinting
);
1038 void wxPrintPreviewBase::Init(wxPrintout
*printout
,
1039 wxPrintout
*printoutForPrinting
)
1042 m_previewPrintout
= printout
;
1043 if (m_previewPrintout
)
1044 m_previewPrintout
->SetIsPreview(true);
1046 m_printPrintout
= printoutForPrinting
;
1048 m_previewCanvas
= NULL
;
1049 m_previewFrame
= NULL
;
1050 m_previewBitmap
= NULL
;
1057 m_printingPrepared
= false;
1062 wxPrintPreviewBase::~wxPrintPreviewBase()
1064 if (m_previewPrintout
)
1065 delete m_previewPrintout
;
1066 if (m_previewBitmap
)
1067 delete m_previewBitmap
;
1068 if (m_printPrintout
)
1069 delete m_printPrintout
;
1072 bool wxPrintPreviewBase::SetCurrentPage(int pageNum
)
1074 if (m_currentPage
== pageNum
)
1077 m_currentPage
= pageNum
;
1078 if (m_previewBitmap
)
1080 delete m_previewBitmap
;
1081 m_previewBitmap
= NULL
;
1084 if (m_previewCanvas
)
1086 AdjustScrollbars(m_previewCanvas
);
1088 if (!RenderPage(pageNum
))
1090 m_previewCanvas
->Refresh();
1091 m_previewCanvas
->SetFocus();
1096 int wxPrintPreviewBase::GetCurrentPage() const
1097 { return m_currentPage
; };
1098 void wxPrintPreviewBase::SetPrintout(wxPrintout
*printout
)
1099 { m_previewPrintout
= printout
; };
1100 wxPrintout
*wxPrintPreviewBase::GetPrintout() const
1101 { return m_previewPrintout
; };
1102 wxPrintout
*wxPrintPreviewBase::GetPrintoutForPrinting() const
1103 { return m_printPrintout
; };
1104 void wxPrintPreviewBase::SetFrame(wxFrame
*frame
)
1105 { m_previewFrame
= frame
; };
1106 void wxPrintPreviewBase::SetCanvas(wxPreviewCanvas
*canvas
)
1107 { m_previewCanvas
= canvas
; };
1108 wxFrame
*wxPrintPreviewBase::GetFrame() const
1109 { return m_previewFrame
; }
1110 wxPreviewCanvas
*wxPrintPreviewBase::GetCanvas() const
1111 { return m_previewCanvas
; }
1113 bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas
*canvas
, wxDC
& dc
)
1115 DrawBlankPage(canvas
, dc
);
1117 if (!m_previewBitmap
)
1118 if (!RenderPage(m_currentPage
))
1121 if (!m_previewBitmap
)
1127 int canvasWidth
, canvasHeight
;
1128 canvas
->GetSize(&canvasWidth
, &canvasHeight
);
1130 double zoomScale
= ((float)m_currentZoom
/(float)100);
1131 double actualWidth
= (zoomScale
*m_pageWidth
*m_previewScale
);
1132 // float actualHeight = (float)(zoomScale*m_pageHeight*m_previewScale);
1134 int x
= (int) ((canvasWidth
- actualWidth
)/2.0);
1135 if (x
< m_leftMargin
)
1137 int y
= m_topMargin
;
1140 temp_dc
.SelectObject(*m_previewBitmap
);
1142 dc
.Blit(x
, y
, m_previewBitmap
->GetWidth(), m_previewBitmap
->GetHeight(), &temp_dc
, 0, 0);
1144 temp_dc
.SelectObject(wxNullBitmap
);
1149 // Adjusts the scrollbars for the current scale
1150 void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas
*canvas
)
1155 int canvasWidth
, canvasHeight
;
1156 canvas
->GetSize(&canvasWidth
, &canvasHeight
);
1158 double zoomScale
= ((float)m_currentZoom
/(float)100);
1159 double actualWidth
= (zoomScale
*m_pageWidth
*m_previewScale
);
1160 double actualHeight
= (zoomScale
*m_pageHeight
*m_previewScale
);
1162 // Set the scrollbars appropriately
1163 int totalWidth
= (int)(actualWidth
+ 2*m_leftMargin
);
1164 int totalHeight
= (int)(actualHeight
+ 2*m_topMargin
);
1165 int scrollUnitsX
= totalWidth
/10;
1166 int scrollUnitsY
= totalHeight
/10;
1167 wxSize virtualSize
= canvas
->GetVirtualSize();
1168 if (virtualSize
.GetWidth() != totalWidth
|| virtualSize
.GetHeight() != totalHeight
)
1169 canvas
->SetScrollbars(10, 10, scrollUnitsX
, scrollUnitsY
, 0, 0, true);
1172 bool wxPrintPreviewBase::RenderPage(int pageNum
)
1176 int canvasWidth
, canvasHeight
;
1178 if (!m_previewCanvas
)
1180 wxFAIL_MSG(_T("wxPrintPreviewBase::RenderPage: must use wxPrintPreviewBase::SetCanvas to let me know about the canvas!"));
1184 m_previewCanvas
->GetSize(&canvasWidth
, &canvasHeight
);
1186 double zoomScale
= (m_currentZoom
/100.0);
1187 int actualWidth
= (int)(zoomScale
*m_pageWidth
*m_previewScale
);
1188 int actualHeight
= (int)(zoomScale
*m_pageHeight
*m_previewScale
);
1190 if (!m_previewBitmap
)
1192 m_previewBitmap
= new wxBitmap((int)actualWidth
, (int)actualHeight
);
1193 if (!m_previewBitmap
|| !m_previewBitmap
->Ok())
1195 if (m_previewBitmap
) {
1196 delete m_previewBitmap
;
1197 m_previewBitmap
= NULL
;
1199 wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK
);
1204 wxMemoryDC memoryDC
;
1205 memoryDC
.SelectObject(*m_previewBitmap
);
1209 m_previewPrintout
->SetDC(&memoryDC
);
1210 m_previewPrintout
->SetPageSizePixels(m_pageWidth
, m_pageHeight
);
1212 // Need to delay OnPreparePrinting until here, so we have enough information.
1213 if (!m_printingPrepared
)
1215 m_previewPrintout
->OnPreparePrinting();
1217 m_previewPrintout
->GetPageInfo(&m_minPage
, &m_maxPage
, &selFrom
, &selTo
);
1218 m_printingPrepared
= true;
1221 m_previewPrintout
->OnBeginPrinting();
1223 if (!m_previewPrintout
->OnBeginDocument(m_printDialogData
.GetFromPage(), m_printDialogData
.GetToPage()))
1225 wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK
);
1227 memoryDC
.SelectObject(wxNullBitmap
);
1229 delete m_previewBitmap
;
1230 m_previewBitmap
= NULL
;
1234 m_previewPrintout
->OnPrintPage(pageNum
);
1235 m_previewPrintout
->OnEndDocument();
1236 m_previewPrintout
->OnEndPrinting();
1238 m_previewPrintout
->SetDC(NULL
);
1240 memoryDC
.SelectObject(wxNullBitmap
);
1245 status
= wxString::Format(_("Page %d of %d"), pageNum
, m_maxPage
);
1247 status
= wxString::Format(_("Page %d"), pageNum
);
1250 m_previewFrame
->SetStatusText(status
);
1257 bool wxPrintPreviewBase::DrawBlankPage(wxPreviewCanvas
*canvas
, wxDC
& dc
)
1259 int canvasWidth
, canvasHeight
;
1260 canvas
->GetSize(&canvasWidth
, &canvasHeight
);
1262 float zoomScale
= (float)((float)m_currentZoom
/(float)100);
1263 float actualWidth
= zoomScale
*m_pageWidth
*m_previewScale
;
1264 float actualHeight
= zoomScale
*m_pageHeight
*m_previewScale
;
1266 float x
= (float)((canvasWidth
- actualWidth
)/2.0);
1267 if (x
< m_leftMargin
)
1268 x
= (float)m_leftMargin
;
1269 float y
= (float)m_topMargin
;
1271 // Draw shadow, allowing for 1-pixel border AROUND the actual page
1272 int shadowOffset
= 4;
1273 dc
.SetPen(*wxBLACK_PEN
);
1274 dc
.SetBrush(*wxBLACK_BRUSH
);
1276 dc.DrawRectangle((int)(x-1 + shadowOffset), (int)(y-1 + shadowOffset), (int)(actualWidth+2), (int)(actualHeight+2));
1278 dc
.DrawRectangle((int)(x
+ shadowOffset
), (int)(y
+ actualHeight
+1), (int)(actualWidth
), shadowOffset
);
1279 dc
.DrawRectangle((int)(x
+ actualWidth
), (int)(y
+ shadowOffset
), shadowOffset
, (int)(actualHeight
));
1281 // Draw blank page allowing for 1-pixel border AROUND the actual page
1282 dc
.SetPen(*wxBLACK_PEN
);
1283 dc
.SetBrush(*wxWHITE_BRUSH
);
1286 wxRegion update_region = canvas->GetUpdateRegion();
1287 wxRect r = update_region.GetBox();
1289 printf( "x: %d y: %d w: %d h: %d.\n", (int)r.x, (int)r.y, (int)r.width, (int)r.height );
1292 dc
.DrawRectangle((int)(x
-2), (int)(y
-1), (int)(actualWidth
+3), (int)(actualHeight
+2));
1297 void wxPrintPreviewBase::SetZoom(int percent
)
1299 if (m_currentZoom
== percent
)
1302 m_currentZoom
= percent
;
1303 if (m_previewBitmap
)
1305 delete m_previewBitmap
;
1306 m_previewBitmap
= NULL
;
1309 if (m_previewCanvas
)
1311 AdjustScrollbars(m_previewCanvas
);
1312 RenderPage(m_currentPage
);
1313 ((wxScrolledWindow
*) m_previewCanvas
)->Scroll(0, 0);
1314 m_previewCanvas
->ClearBackground();
1315 m_previewCanvas
->Refresh();
1316 m_previewCanvas
->SetFocus();
1320 wxPrintDialogData
& wxPrintPreviewBase::GetPrintDialogData()
1322 return m_printDialogData
;
1325 int wxPrintPreviewBase::GetZoom() const
1326 { return m_currentZoom
; }
1327 int wxPrintPreviewBase::GetMaxPage() const
1328 { return m_maxPage
; }
1329 int wxPrintPreviewBase::GetMinPage() const
1330 { return m_minPage
; }
1331 bool wxPrintPreviewBase::Ok() const
1333 void wxPrintPreviewBase::SetOk(bool ok
)
1335 //----------------------------------------------------------------------------
1337 //----------------------------------------------------------------------------
1339 IMPLEMENT_CLASS(wxPrintPreview
, wxPrintPreviewBase
)
1341 wxPrintPreview::wxPrintPreview(wxPrintout
*printout
,
1342 wxPrintout
*printoutForPrinting
,
1343 wxPrintDialogData
*data
) :
1344 wxPrintPreviewBase( printout
, printoutForPrinting
, data
)
1346 m_pimpl
= wxPrintFactory::GetFactory()->
1347 CreatePrintPreview( printout
, printoutForPrinting
, data
);
1350 wxPrintPreview::wxPrintPreview(wxPrintout
*printout
,
1351 wxPrintout
*printoutForPrinting
,
1352 wxPrintData
*data
) :
1353 wxPrintPreviewBase( printout
, printoutForPrinting
, data
)
1355 m_pimpl
= wxPrintFactory::GetFactory()->
1356 CreatePrintPreview( printout
, printoutForPrinting
, data
);
1359 wxPrintPreview::~wxPrintPreview()
1363 // don't delete twice
1364 m_printPrintout
= NULL
;
1365 m_previewPrintout
= NULL
;
1366 m_previewBitmap
= NULL
;
1369 bool wxPrintPreview::SetCurrentPage(int pageNum
)
1371 return m_pimpl
->SetCurrentPage( pageNum
);
1374 int wxPrintPreview::GetCurrentPage() const
1376 return m_pimpl
->GetCurrentPage();
1379 void wxPrintPreview::SetPrintout(wxPrintout
*printout
)
1381 m_pimpl
->SetPrintout( printout
);
1384 wxPrintout
*wxPrintPreview::GetPrintout() const
1386 return m_pimpl
->GetPrintout();
1389 wxPrintout
*wxPrintPreview::GetPrintoutForPrinting() const
1391 return m_pimpl
->GetPrintoutForPrinting();
1394 void wxPrintPreview::SetFrame(wxFrame
*frame
)
1396 m_pimpl
->SetFrame( frame
);
1399 void wxPrintPreview::SetCanvas(wxPreviewCanvas
*canvas
)
1401 m_pimpl
->SetCanvas( canvas
);
1404 wxFrame
*wxPrintPreview::GetFrame() const
1406 return m_pimpl
->GetFrame();
1409 wxPreviewCanvas
*wxPrintPreview::GetCanvas() const
1411 return m_pimpl
->GetCanvas();
1414 bool wxPrintPreview::PaintPage(wxPreviewCanvas
*canvas
, wxDC
& dc
)
1416 return m_pimpl
->PaintPage( canvas
, dc
);
1419 bool wxPrintPreview::DrawBlankPage(wxPreviewCanvas
*canvas
, wxDC
& dc
)
1421 return m_pimpl
->DrawBlankPage( canvas
, dc
);
1424 void wxPrintPreview::AdjustScrollbars(wxPreviewCanvas
*canvas
)
1426 m_pimpl
->AdjustScrollbars( canvas
);
1429 bool wxPrintPreview::RenderPage(int pageNum
)
1431 return m_pimpl
->RenderPage( pageNum
);
1434 void wxPrintPreview::SetZoom(int percent
)
1436 m_pimpl
->SetZoom( percent
);
1439 wxPrintDialogData
& wxPrintPreview::GetPrintDialogData()
1441 return m_pimpl
->GetPrintDialogData();
1444 int wxPrintPreview::GetMaxPage() const
1446 return m_pimpl
->GetMaxPage();
1449 int wxPrintPreview::GetMinPage() const
1451 return m_pimpl
->GetMinPage();
1454 bool wxPrintPreview::Ok() const
1456 return m_pimpl
->Ok();
1459 void wxPrintPreview::SetOk(bool ok
)
1461 m_pimpl
->SetOk( ok
);
1464 bool wxPrintPreview::Print(bool interactive
)
1466 return m_pimpl
->Print( interactive
);
1469 void wxPrintPreview::DetermineScaling()
1471 m_pimpl
->DetermineScaling();
1475 #endif // wxUSE_PRINTING_ARCHITECTURE