X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/95724b1aa2f7248091cdec506d4678b4fbcea20d..f4d233c74aa689b9d5160dcdddc5324812c972a3:/src/common/prntbase.cpp diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index 7966f5479b..9c24e2d686 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -5,11 +5,11 @@ // Modified by: // Created: 04/01/98 // RCS-ID: $Id$ -// Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Copyright: (c) Julian Smart +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "prntbase.h" #endif @@ -36,7 +36,9 @@ #include "wx/dcmemory.h" #include "wx/stattext.h" #include "wx/intl.h" -#endif +#include "wx/textdlg.h" +#include "wx/sizer.h" +#endif // !WX_PRECOMP #include "wx/prntbase.h" #include "wx/dcprint.h" @@ -55,7 +57,6 @@ #endif #endif // __WXMSW__ -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxPrinterBase, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxPrintout, wxObject) IMPLEMENT_CLASS(wxPreviewCanvas, wxWindow) @@ -69,9 +70,9 @@ END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow) EVT_PAINT(wxPreviewCanvas::OnPaint) + EVT_CHAR(wxPreviewCanvas::OnChar) EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged) END_EVENT_TABLE() -#endif /* * Printer @@ -84,10 +85,12 @@ wxPrinterBase::wxPrinterBase(wxPrintDialogData *data) sm_abortIt = FALSE; if (data) m_printDialogData = (*data); + sm_lastError = wxPRINTER_NO_ERROR; } wxWindow *wxPrinterBase::sm_abortWindow = (wxWindow *) NULL; bool wxPrinterBase::sm_abortIt = FALSE; +wxPrinterError wxPrinterBase::sm_lastError = wxPRINTER_NO_ERROR; wxPrinterBase::~wxPrinterBase() { @@ -101,21 +104,24 @@ void wxPrintAbortDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) wxPrinterBase::sm_abortWindow = (wxWindow *) NULL; } -wxWindow *wxPrinterBase::CreateAbortWindow(wxWindow *parent, wxPrintout *WXUNUSED(printout)) +wxWindow *wxPrinterBase::CreateAbortWindow(wxWindow *parent, wxPrintout * printout) { - wxPrintAbortDialog *dialog = new wxPrintAbortDialog(parent, _("Printing"), wxPoint(0, 0), wxSize(400, 400), wxDEFAULT_DIALOG_STYLE); - (void) new wxStaticText(dialog, -1, _("Please wait..."), wxPoint(5, 5)); + wxPrintAbortDialog *dialog = new wxPrintAbortDialog(parent, _("Printing ") , wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE); + + wxBoxSizer *button_sizer = new wxBoxSizer( wxVERTICAL ); + button_sizer->Add( new wxStaticText(dialog, -1, _("Please wait while printing\n") + printout->GetTitle() ), 0, wxALL, 10 ); + button_sizer->Add( new wxButton( dialog, wxID_CANCEL, wxT("Cancel") ), 0, wxALL | wxALIGN_CENTER, 10 ); - wxButton *button = new wxButton(dialog, wxID_CANCEL, _("Cancel"), wxPoint(5, 30)); + dialog->SetAutoLayout( TRUE ); + dialog->SetSizer( button_sizer ); - dialog->Fit(); - button->Centre(wxHORIZONTAL); + button_sizer->Fit(dialog); + button_sizer->SetSizeHints (dialog) ; - dialog->Centre(); return dialog; } -void wxPrinterBase::ReportError(wxWindow *parent, wxPrintout *WXUNUSED(printout), char *message) +void wxPrinterBase::ReportError(wxWindow *parent, wxPrintout *WXUNUSED(printout), const wxString& message) { wxMessageBox(message, _("Printing Error"), wxOK, parent); } @@ -145,7 +151,7 @@ wxPrintout::~wxPrintout() bool wxPrintout::OnBeginDocument(int WXUNUSED(startPage), int WXUNUSED(endPage)) { - return GetDC()->StartDoc(_("Printing")); + return GetDC()->StartDoc(_("Printing ") + m_printoutTitle); } void wxPrintout::OnEndDocument() @@ -178,14 +184,25 @@ void wxPrintout::GetPageInfo(int *minPage, int *maxPage, int *fromPage, int *toP * Preview canvas */ +// VZ: the current code doesn't refresh properly without +// wxFULL_REPAINT_ON_RESIZE, this must be fixed as otherwise we have +// really horrible flicker when resizing the preview frame, but without +// this style it simply doesn't work correctly at all... wxPreviewCanvas::wxPreviewCanvas(wxPrintPreviewBase *preview, wxWindow *parent, const wxPoint& pos, const wxSize& size, long style, const wxString& name): -wxScrolledWindow(parent, -1, pos, size, style, name) +wxScrolledWindow(parent, -1, pos, size, style | wxFULL_REPAINT_ON_RESIZE, name) { m_printPreview = preview; - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); +#ifdef __WXMAC__ + // The app workspace colour is always white, but we should have + // a contrast with the page. + wxSystemColour colourIndex = wxSYS_COLOUR_3DDKSHADOW; +#else + wxSystemColour colourIndex = wxSYS_COLOUR_APPWORKSPACE; +#endif + SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); - SetScrollbars(15, 18, 100, 100); + SetScrollbars(10, 10, 100, 100); } wxPreviewCanvas::~wxPreviewCanvas() @@ -197,6 +214,13 @@ void wxPreviewCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) wxPaintDC dc(this); PrepareDC( dc ); +/* +#ifdef __WXGTK__ + if (!GetUpdateRegion().IsEmpty()) + dc.SetClippingRegion( GetUpdateRegion() ); +#endif +*/ + if (m_printPreview) { m_printPreview->PaintPage(this, dc); @@ -206,23 +230,72 @@ void wxPreviewCanvas::OnPaint(wxPaintEvent& WXUNUSED(event)) // Responds to colour changes, and passes event on to children. void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) { - SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); +#ifdef __WXMAC__ + // The app workspace colour is always white, but we should have + // a contrast with the page. + wxSystemColour colourIndex = wxSYS_COLOUR_3DDKSHADOW; +#else + wxSystemColour colourIndex = wxSYS_COLOUR_APPWORKSPACE; +#endif + SetBackgroundColour(wxSystemSettings::GetColour(colourIndex)); Refresh(); // Propagate the event to the non-top-level children wxWindow::OnSysColourChanged(event); } +void wxPreviewCanvas::OnChar(wxKeyEvent &event) +{ + wxPreviewControlBar* controlBar = ((wxPreviewFrame*) GetParent())->GetControlBar(); + if (event.GetKeyCode() == WXK_ESCAPE) + { + ((wxPreviewFrame*) GetParent())->Close(TRUE); + return; + } + else if (event.GetKeyCode() == WXK_TAB) + { + controlBar->OnGoto(); + return; + } + else if (event.GetKeyCode() == WXK_RETURN) + { + controlBar->OnPrint(); + return; + } + + if (!event.ControlDown()) + { + event.Skip(); + return; + } + + switch(event.GetKeyCode()) + { + case WXK_NEXT: + controlBar->OnNext(); break; + case WXK_PRIOR: + controlBar->OnPrevious(); break; + case WXK_HOME: + controlBar->OnFirst(); break; + case WXK_END: + controlBar->OnLast(); break; + default: + event.Skip(); + } +} + /* * Preview control bar */ BEGIN_EVENT_TABLE(wxPreviewControlBar, wxPanel) EVT_BUTTON(wxID_PREVIEW_CLOSE, wxPreviewControlBar::OnWindowClose) - EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrint) + EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrintButton) EVT_BUTTON(wxID_PREVIEW_PREVIOUS, wxPreviewControlBar::OnPreviousButton) EVT_BUTTON(wxID_PREVIEW_NEXT, wxPreviewControlBar::OnNextButton) - EVT_CHAR(wxPreviewControlBar::OnChar) + EVT_BUTTON(wxID_PREVIEW_FIRST, wxPreviewControlBar::OnFirstButton) + EVT_BUTTON(wxID_PREVIEW_LAST, wxPreviewControlBar::OnLastButton) + EVT_BUTTON(wxID_PREVIEW_GOTO, wxPreviewControlBar::OnGotoButton) EVT_CHOICE(wxID_PREVIEW_ZOOM, wxPreviewControlBar::OnZoom) EVT_PAINT(wxPreviewControlBar::OnPaint) END_EVENT_TABLE() @@ -262,25 +335,12 @@ void wxPreviewControlBar::OnWindowClose(wxCommandEvent& WXUNUSED(event)) frame->Close(TRUE); } -void wxPreviewControlBar::OnPrint(wxCommandEvent& WXUNUSED(event)) +void wxPreviewControlBar::OnPrint(void) { wxPrintPreviewBase *preview = GetPrintPreview(); preview->Print(TRUE); } -void wxPreviewControlBar::OnChar(wxKeyEvent &event) -{ - switch(event.KeyCode()) - { - case WXK_NEXT: - OnNext(); break; - case WXK_PRIOR: - OnPrevious(); break; - default: - event.Skip(); - } -} - void wxPreviewControlBar::OnNext(void) { wxPrintPreviewBase *preview = GetPrintPreview(); @@ -311,6 +371,60 @@ void wxPreviewControlBar::OnPrevious(void) } } +void wxPreviewControlBar::OnFirst(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + int currentPage = preview->GetMinPage(); + if (preview->GetPrintout()->HasPage(currentPage)) + { + preview->SetCurrentPage(currentPage); + } + } +} + +void wxPreviewControlBar::OnLast(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + int currentPage = preview->GetMaxPage(); + if (preview->GetPrintout()->HasPage(currentPage)) + { + preview->SetCurrentPage(currentPage); + } + } +} + +void wxPreviewControlBar::OnGoto(void) +{ + wxPrintPreviewBase *preview = GetPrintPreview(); + if (preview) + { + long currentPage; + + if (preview->GetMinPage() > 0) + { + wxString strPrompt; + wxString strPage; + + strPrompt.Printf( _("Enter a page number between %d and %d:"), + preview->GetMinPage(), preview->GetMaxPage()); + strPage.Printf( wxT("%d"), preview->GetCurrentPage() ); + + strPage = + wxGetTextFromUser( strPrompt, _("Goto Page"), strPage, GetParent()); + + if ( strPage.ToLong( ¤tPage ) ) + if (preview->GetPrintout()->HasPage(currentPage)) + { + preview->SetCurrentPage(currentPage); + } + } + } +} + void wxPreviewControlBar::OnZoom(wxCommandEvent& WXUNUSED(event)) { int zoom = GetZoomControl(); @@ -322,108 +436,96 @@ void wxPreviewControlBar::CreateButtons() { SetSize(0, 0, 400, 40); - /* - #ifdef __WXMSW__ - int fontSize = 9; - #else - int fontSize = 10; - #endif - - wxFont buttonFont(fontSize, wxSWISS, wxNORMAL, wxBOLD); - SetFont(buttonFont); - */ + wxBoxSizer *item0 = new wxBoxSizer( wxHORIZONTAL ); - int buttonWidth = 65; -#ifdef __WXGTK__ - int buttonHeight = -1; -#else - int buttonHeight = 24; -#endif - - int x = 5; - int y = 5; - -#ifdef __WXMOTIF__ - int gap = 15; -#else - int gap = 5; -#endif - - m_closeButton = new wxButton(this, wxID_PREVIEW_CLOSE, _("Close"), - wxPoint(x, y), wxSize(buttonWidth, buttonHeight)); - - x += gap + buttonWidth; + m_closeButton = new wxButton( this, wxID_PREVIEW_CLOSE, _("&Close"), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( m_closeButton, 0, wxALIGN_CENTRE|wxALL, 5 ); if (m_buttonFlags & wxPREVIEW_PRINT) { - m_printButton = new wxButton(this, wxID_PREVIEW_PRINT, _("Print..."), wxPoint(x, y), - wxSize(buttonWidth, buttonHeight)); - x += gap + buttonWidth; + m_printButton = new wxButton( this, wxID_PREVIEW_PRINT, _("&Print..."), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( m_printButton, 0, wxALIGN_CENTRE|wxALL, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_FIRST) + { + m_firstPageButton = new wxButton( this, wxID_PREVIEW_FIRST, _("|<<"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); + item0->Add( m_firstPageButton, 0, wxALIGN_CENTRE|wxALL, 5 ); } if (m_buttonFlags & wxPREVIEW_PREVIOUS) { - m_previousPageButton = new wxButton(this, wxID_PREVIEW_PREVIOUS, wxT("<<"), wxPoint(x, y), - wxSize(buttonWidth, buttonHeight)); - x += gap + buttonWidth; + m_previousPageButton = new wxButton( this, wxID_PREVIEW_PREVIOUS, _("<<"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); + item0->Add( m_previousPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); } if (m_buttonFlags & wxPREVIEW_NEXT) { - m_nextPageButton = new wxButton(this, wxID_PREVIEW_NEXT, wxT(">>"), - wxPoint(x, y), wxSize(buttonWidth, buttonHeight)); - x += gap + buttonWidth; + m_nextPageButton = new wxButton( this, wxID_PREVIEW_NEXT, _(">>"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); + item0->Add( m_nextPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_LAST) + { + m_lastPageButton = new wxButton( this, wxID_PREVIEW_LAST, _(">>|"), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); + item0->Add( m_lastPageButton, 0, wxALIGN_CENTRE|wxRIGHT|wxTOP|wxBOTTOM, 5 ); + } + + if (m_buttonFlags & wxPREVIEW_GOTO) + { + m_gotoPageButton = new wxButton( this, wxID_PREVIEW_GOTO, _("&Goto..."), wxDefaultPosition, wxDefaultSize, 0 ); + item0->Add( m_gotoPageButton, 0, wxALIGN_CENTRE|wxALL, 5 ); } if (m_buttonFlags & wxPREVIEW_ZOOM) { - static const char *choices[] = + wxString choices[] = { - "10%", "15%", "20%", "25%", "30%", "35%", "40%", "45%", "50%", "55%", - "60%", "65%", "70%", "75%", "80%", "85%", "90%", "95%", "100%", "110%", - "120%", "150%", "200%" + wxT("10%"), wxT("15%"), wxT("20%"), wxT("25%"), wxT("30%"), wxT("35%"), wxT("40%"), wxT("45%"), wxT("50%"), wxT("55%"), + wxT("60%"), wxT("65%"), wxT("70%"), wxT("75%"), wxT("80%"), wxT("85%"), wxT("90%"), wxT("95%"), wxT("100%"), wxT("110%"), + wxT("120%"), wxT("150%"), wxT("200%") }; - int n = WXSIZEOF(choices); - wxString* strings = new wxString[n]; - int i; - for (i = 0; i < n; i++ ) - strings[i] = choices[i]; - - m_zoomControl = new wxChoice(this, wxID_PREVIEW_ZOOM, - wxPoint(x, y), - wxSize(100, -1), - n, - strings - ); - delete[] strings; - + m_zoomControl = new wxChoice( this, wxID_PREVIEW_ZOOM, wxDefaultPosition, wxSize(70,-1), n, choices, 0 ); + item0->Add( m_zoomControl, 0, wxALIGN_CENTRE|wxALL, 5 ); SetZoomControl(m_printPreview->GetZoom()); } - // m_closeButton->SetDefault(); + SetSizer(item0); + item0->Fit(this); } void wxPreviewControlBar::SetZoomControl(int zoom) { - char buf[20]; - sprintf(buf, "%d%%", zoom); -// Someone is calling methods that do no exist in wxChoice!! So I'll just comment out for VA for now if (m_zoomControl) - m_zoomControl->SetStringSelection(buf); + { + int n, count = m_zoomControl->GetCount(); + long val; + for (n=0; nGetString(n).BeforeFirst(wxT('%')).ToLong(&val) && + (val >= long(zoom))) + { + m_zoomControl->SetSelection(n); + return; + } + } + + m_zoomControl->SetSelection(count-1); + } } int wxPreviewControlBar::GetZoomControl() { - wxChar buf[20]; - if (m_zoomControl && (m_zoomControl->GetStringSelection() != wxT(""))) + if (m_zoomControl && (m_zoomControl->GetStringSelection() != wxEmptyString)) { - wxStrcpy(buf, m_zoomControl->GetStringSelection()); - buf[wxStrlen(buf) - 1] = 0; - return (int)wxAtoi(buf); + long val; + if (m_zoomControl->GetStringSelection().BeforeFirst(wxT('%')).ToLong(&val)) + return int(val); } - else return 0; + + return 0; } @@ -435,13 +537,20 @@ BEGIN_EVENT_TABLE(wxPreviewFrame, wxFrame) EVT_CLOSE(wxPreviewFrame::OnCloseWindow) END_EVENT_TABLE() -wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase *preview, wxFrame *parent, const wxString& title, +wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase *preview, wxWindow *parent, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name): wxFrame(parent, -1, title, pos, size, style, name) { m_printPreview = preview; m_controlBar = NULL; m_previewCanvas = NULL; + + // Give the application icon +#ifdef __WXMSW__ + wxFrame* topFrame = wxDynamicCast(wxTheApp->GetTopWindow(), wxFrame); + if (topFrame) + SetIcon(topFrame->GetIcon()); +#endif } wxPreviewFrame::~wxPreviewFrame() @@ -450,7 +559,11 @@ wxPreviewFrame::~wxPreviewFrame() void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { + // MakeModal doesn't work on wxMac, especially when there + // are multiple top-level windows. +#ifndef __WXMAC__ MakeModal(FALSE); +#endif // Need to delete the printout and the print preview wxPrintout *printout = m_printPreview->GetPrintout(); @@ -468,49 +581,34 @@ void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) void wxPreviewFrame::Initialize() { +#if wxUSE_STATUSBAR CreateStatusBar(); - +#endif CreateCanvas(); CreateControlBar(); m_printPreview->SetCanvas(m_previewCanvas); m_printPreview->SetFrame(this); - // Set layout constraints here + wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL ); - // Control bar constraints - wxLayoutConstraints *c1 = new wxLayoutConstraints; - // int w, h; - // m_controlBar->GetSize(&w, &h); - int h; -#if (defined(__WXMSW__) || defined(__WXGTK__)) - h = 40; -#else - h = 60; -#endif - - c1->left.SameAs (this, wxLeft); - c1->top.SameAs (this, wxTop); - c1->right.SameAs (this, wxRight); - c1->height.Absolute (h); - - m_controlBar->SetConstraints(c1); - - // Canvas constraints - wxLayoutConstraints *c2 = new wxLayoutConstraints; - - c2->left.SameAs (this, wxLeft); - c2->top.Below (m_controlBar); - c2->right.SameAs (this, wxRight); - c2->bottom.SameAs (this, wxBottom); + item0->Add( m_controlBar, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); + item0->Add( m_previewCanvas, 1, wxGROW|wxALIGN_CENTER_VERTICAL, 5 ); - m_previewCanvas->SetConstraints(c2); - - SetAutoLayout(TRUE); + SetAutoLayout( TRUE ); + SetSizer( item0 ); + // MakeModal doesn't work on wxMac, especially when there + // are multiple top-level windows. +#ifndef __WXMAC__ MakeModal(TRUE); +#endif Layout(); + + m_printPreview->AdjustScrollbars(m_previewCanvas); + m_previewCanvas->SetFocus(); + m_controlBar->SetFocus(); } void wxPreviewFrame::CreateCanvas() @@ -572,13 +670,8 @@ void wxPrintPreviewBase::Init(wxPrintout *printout, m_pageWidth = 0; m_pageHeight = 0; m_printingPrepared = FALSE; - - // Too soon! Moved to RenderPage. - // printout->OnPreparePrinting(); - - // Get some parameters from the printout, if defined - int selFrom, selTo; - printout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo); + m_minPage = 1; + m_maxPage = 1; } wxPrintPreviewBase::~wxPrintPreviewBase() @@ -605,18 +698,23 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum) if (m_previewCanvas) { - RenderPage(pageNum); + AdjustScrollbars(m_previewCanvas); + + if (!RenderPage(pageNum)) + return FALSE; m_previewCanvas->Refresh(); + m_previewCanvas->SetFocus(); } return TRUE; } -bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc) +bool wxPrintPreviewBase::PaintPage(wxPreviewCanvas *canvas, wxDC& dc) { DrawBlankPage(canvas, dc); if (!m_previewBitmap) - RenderPage(m_currentPage); + if (!RenderPage(m_currentPage)) + return FALSE; if (!m_previewBitmap) return FALSE; @@ -646,14 +744,39 @@ bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc) return TRUE; } +// Adjusts the scrollbars for the current scale +void wxPrintPreviewBase::AdjustScrollbars(wxPreviewCanvas *canvas) +{ + if (!canvas) + return ; + + int canvasWidth, canvasHeight; + canvas->GetSize(&canvasWidth, &canvasHeight); + + double zoomScale = ((float)m_currentZoom/(float)100); + double actualWidth = (zoomScale*m_pageWidth*m_previewScale); + double actualHeight = (zoomScale*m_pageHeight*m_previewScale); + + // Set the scrollbars appropriately + int totalWidth = (int)(actualWidth + 2*m_leftMargin); + int totalHeight = (int)(actualHeight + 2*m_topMargin); + int scrollUnitsX = totalWidth/10; + int scrollUnitsY = totalHeight/10; + wxSize virtualSize = canvas->GetVirtualSize(); + if (virtualSize.GetWidth() != totalWidth || virtualSize.GetHeight() != totalHeight) + canvas->SetScrollbars(10, 10, scrollUnitsX, scrollUnitsY, 0, 0, TRUE); +} + bool wxPrintPreviewBase::RenderPage(int pageNum) { + wxBusyCursor busy; + int canvasWidth, canvasHeight; if (!m_previewCanvas) { - wxMessageBox(_("wxPrintPreviewBase::RenderPage: must use wxPrintPreviewBase::SetCanvas to let me know about the canvas!"), - _("Print Preview Failure"), wxOK); + wxFAIL_MSG(_T("wxPrintPreviewBase::RenderPage: must use wxPrintPreviewBase::SetCanvas to let me know about the canvas!")); + return FALSE; } m_previewCanvas->GetSize(&canvasWidth, &canvasHeight); @@ -662,19 +785,15 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) int actualWidth = (int)(zoomScale*m_pageWidth*m_previewScale); int actualHeight = (int)(zoomScale*m_pageHeight*m_previewScale); - int x = (int)((canvasWidth - actualWidth)/2.0); - if (x < m_leftMargin) - x = m_leftMargin; - // int y = m_topMargin; - - if (!m_previewBitmap) { m_previewBitmap = new wxBitmap((int)actualWidth, (int)actualHeight); if (!m_previewBitmap || !m_previewBitmap->Ok()) { - if (m_previewBitmap) + if (m_previewBitmap) { delete m_previewBitmap; + m_previewBitmap = NULL; + } wxMessageBox(_("Sorry, not enough memory to create a preview."), _("Print Preview Failure"), wxOK); return FALSE; } @@ -692,6 +811,8 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) if (!m_printingPrepared) { m_previewPrintout->OnPreparePrinting(); + int selFrom, selTo; + m_previewPrintout->GetPageInfo(&m_minPage, &m_maxPage, &selFrom, &selTo); m_printingPrepared = TRUE; } @@ -704,6 +825,7 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) memoryDC.SelectObject(wxNullBitmap); delete m_previewBitmap; + m_previewBitmap = NULL; return FALSE; } @@ -715,20 +837,22 @@ bool wxPrintPreviewBase::RenderPage(int pageNum) memoryDC.SelectObject(wxNullBitmap); - wxChar buf[200]; +#if wxUSE_STATUSBAR + wxString status; if (m_maxPage != 0) - wxSprintf(buf, _("Page %d of %d"), pageNum, m_maxPage); + status = wxString::Format(_("Page %d of %d"), pageNum, m_maxPage); else - wxSprintf(buf, _("Page %d"), pageNum); + status = wxString::Format(_("Page %d"), pageNum); if (m_previewFrame) - m_previewFrame->SetStatusText(buf); + m_previewFrame->SetStatusText(status); +#endif return TRUE; } -bool wxPrintPreviewBase::DrawBlankPage(wxWindow *canvas, wxDC& dc) +bool wxPrintPreviewBase::DrawBlankPage(wxPreviewCanvas *canvas, wxDC& dc) { int canvasWidth, canvasHeight; canvas->GetSize(&canvasWidth, &canvasHeight); @@ -782,10 +906,12 @@ void wxPrintPreviewBase::SetZoom(int percent) if (m_previewCanvas) { + AdjustScrollbars(m_previewCanvas); RenderPage(m_currentPage); ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0); - m_previewCanvas->Clear(); + m_previewCanvas->ClearBackground(); m_previewCanvas->Refresh(); + m_previewCanvas->SetFocus(); } }