X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7bcb11d30764df47144189e164f53d8171ed4a63..4aaef122cbbd5bbe0e70b824e320458e2329dd13:/src/common/prntbase.cpp diff --git a/src/common/prntbase.cpp b/src/common/prntbase.cpp index be9ab9a52f..8e7e80b769 100644 --- a/src/common/prntbase.cpp +++ b/src/common/prntbase.cpp @@ -6,7 +6,7 @@ // Created: 04/01/98 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows license +// Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifdef __GNUG__ @@ -22,6 +22,8 @@ #include "wx/defs.h" +#if wxUSE_PRINTING_ARCHITECTURE + #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/dc.h" @@ -45,22 +47,14 @@ #include #ifdef __WXMSW__ -#include -#include - -// Clash with Windows header files -#ifdef StartDoc -#undef StartDoc -#endif - -#ifndef __WIN32__ -#include -#endif + #include "wx/msw/private.h" + #include -#endif -// End __WXMSW__ + #ifndef __WIN32__ + #include + #endif +#endif // __WXMSW__ -#if !USE_SHARED_LIBRARY IMPLEMENT_CLASS(wxPrinterBase, wxObject) IMPLEMENT_ABSTRACT_CLASS(wxPrintout, wxObject) IMPLEMENT_CLASS(wxPreviewCanvas, wxWindow) @@ -69,14 +63,13 @@ IMPLEMENT_CLASS(wxPreviewFrame, wxFrame) IMPLEMENT_CLASS(wxPrintPreviewBase, wxObject) BEGIN_EVENT_TABLE(wxPrintAbortDialog, wxDialog) -EVT_BUTTON(wxID_CANCEL, wxPrintAbortDialog::OnCancel) + EVT_BUTTON(wxID_CANCEL, wxPrintAbortDialog::OnCancel) END_EVENT_TABLE() BEGIN_EVENT_TABLE(wxPreviewCanvas, wxScrolledWindow) -EVT_PAINT(wxPreviewCanvas::OnPaint) -EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged) + EVT_PAINT(wxPreviewCanvas::OnPaint) + EVT_SYS_COLOUR_CHANGED(wxPreviewCanvas::OnSysColourChanged) END_EVENT_TABLE() -#endif /* * Printer @@ -89,10 +82,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() { @@ -110,17 +105,17 @@ wxWindow *wxPrinterBase::CreateAbortWindow(wxWindow *parent, wxPrintout *WXUNUSE { 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)); - + wxButton *button = new wxButton(dialog, wxID_CANCEL, _("Cancel"), wxPoint(5, 30)); - + dialog->Fit(); button->Centre(wxHORIZONTAL); - + 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); } @@ -189,7 +184,7 @@ wxScrolledWindow(parent, -1, pos, size, style, name) { m_printPreview = preview; SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); - + SetScrollbars(15, 18, 100, 100); } @@ -201,7 +196,14 @@ 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); @@ -213,7 +215,7 @@ void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) { SetBackgroundColour(wxSystemSettings::GetSystemColour(wxSYS_COLOUR_APPWORKSPACE)); Refresh(); - + // Propagate the event to the non-top-level children wxWindow::OnSysColourChanged(event); } @@ -223,12 +225,13 @@ void wxPreviewCanvas::OnSysColourChanged(wxSysColourChangedEvent& event) */ BEGIN_EVENT_TABLE(wxPreviewControlBar, wxPanel) -EVT_BUTTON(wxID_PREVIEW_CLOSE, wxPreviewControlBar::OnWindowClose) -EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrint) -EVT_BUTTON(wxID_PREVIEW_PREVIOUS, wxPreviewControlBar::OnPrevious) -EVT_BUTTON(wxID_PREVIEW_NEXT, wxPreviewControlBar::OnNext) -EVT_CHOICE(wxID_PREVIEW_ZOOM, wxPreviewControlBar::OnZoom) -EVT_PAINT(wxPreviewControlBar::OnPaint) + EVT_BUTTON(wxID_PREVIEW_CLOSE, wxPreviewControlBar::OnWindowClose) + EVT_BUTTON(wxID_PREVIEW_PRINT, wxPreviewControlBar::OnPrint) + EVT_BUTTON(wxID_PREVIEW_PREVIOUS, wxPreviewControlBar::OnPreviousButton) + EVT_BUTTON(wxID_PREVIEW_NEXT, wxPreviewControlBar::OnNextButton) + EVT_CHAR(wxPreviewControlBar::OnChar) + EVT_CHOICE(wxID_PREVIEW_ZOOM, wxPreviewControlBar::OnZoom) + EVT_PAINT(wxPreviewControlBar::OnPaint) END_EVENT_TABLE() wxPreviewControlBar::wxPreviewControlBar(wxPrintPreviewBase *preview, long buttons, @@ -252,7 +255,7 @@ wxPreviewControlBar::~wxPreviewControlBar() void wxPreviewControlBar::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); - + int w, h; GetSize(&w, &h); dc.SetPen(*wxBLACK_PEN); @@ -272,7 +275,20 @@ void wxPreviewControlBar::OnPrint(wxCommandEvent& WXUNUSED(event)) preview->Print(TRUE); } -void wxPreviewControlBar::OnNext(wxCommandEvent& WXUNUSED(event)) +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(); if (preview) @@ -287,7 +303,7 @@ void wxPreviewControlBar::OnNext(wxCommandEvent& WXUNUSED(event)) } } -void wxPreviewControlBar::OnPrevious(wxCommandEvent& WXUNUSED(event)) +void wxPreviewControlBar::OnPrevious(void) { wxPrintPreviewBase *preview = GetPrintPreview(); if (preview) @@ -312,96 +328,87 @@ void wxPreviewControlBar::OnZoom(wxCommandEvent& WXUNUSED(event)) 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); */ - + 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; - + if (m_buttonFlags & wxPREVIEW_PRINT) { m_printButton = new wxButton(this, wxID_PREVIEW_PRINT, _("Print..."), wxPoint(x, y), wxSize(buttonWidth, buttonHeight)); x += gap + buttonWidth; } - + if (m_buttonFlags & wxPREVIEW_PREVIOUS) { - m_previousPageButton = new wxButton(this, wxID_PREVIEW_PREVIOUS, "<<", wxPoint(x, y), + m_previousPageButton = new wxButton(this, wxID_PREVIEW_PREVIOUS, wxT("<<"), wxPoint(x, y), wxSize(buttonWidth, buttonHeight)); x += gap + buttonWidth; } - + if (m_buttonFlags & wxPREVIEW_NEXT) { - m_nextPageButton = new wxButton(this, wxID_PREVIEW_NEXT, ">>", + m_nextPageButton = new wxButton(this, wxID_PREVIEW_NEXT, wxT(">>"), wxPoint(x, y), wxSize(buttonWidth, buttonHeight)); x += gap + buttonWidth; } - - // Yes, this look stupid, but this is because gcc gives up otherwise. - wxString *choices = new wxString[23]; - choices[0] = "10%"; - choices[1] = "15%"; - choices[2] = "20%"; - choices[3] = "25%"; - choices[4] = "30%"; - choices[5] = "35%"; - choices[6] = "40%"; - choices[7] = "45%"; - choices[8] = "50%"; - choices[9] = "55%"; - choices[10] = "60%"; - choices[11] = "65%"; - choices[12] = "70%"; - choices[13] = "75%"; - choices[14] = "80%"; - choices[15] = "85%"; - choices[16] = "90%"; - choices[17] = "95%"; - choices[18] = "100%"; - choices[19] = "110%"; - choices[20] = "120%"; - choices[21] = "150%"; - choices[22] = "200%"; - - int n = 23; + if (m_buttonFlags & wxPREVIEW_ZOOM) { - m_zoomControl = new wxChoice(this, wxID_PREVIEW_ZOOM, wxPoint(x, y), - wxSize(100, -1), n, (wxString *)choices); + static const char *choices[] = + { + "10%", "15%", "20%", "25%", "30%", "35%", "40%", "45%", "50%", "55%", + "60%", "65%", "70%", "75%", "80%", "85%", "90%", "95%", "100%", "110%", + "120%", "150%", "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; + SetZoomControl(m_printPreview->GetZoom()); } - - delete[] choices; - + // m_closeButton->SetDefault(); } @@ -409,18 +416,19 @@ 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 wxPreviewControlBar::GetZoomControl() { - char buf[20]; - if (m_zoomControl && (m_zoomControl->GetStringSelection() != "")) + wxChar buf[20]; + if (m_zoomControl && (m_zoomControl->GetStringSelection() != wxT(""))) { - strcpy(buf, m_zoomControl->GetStringSelection()); - buf[strlen(buf) - 1] = 0; - return (int)atoi(buf); + wxStrcpy(buf, m_zoomControl->GetStringSelection()); + buf[wxStrlen(buf) - 1] = 0; + return (int)wxAtoi(buf); } else return 0; } @@ -431,7 +439,7 @@ int wxPreviewControlBar::GetZoomControl() */ BEGIN_EVENT_TABLE(wxPreviewFrame, wxFrame) -EVT_CLOSE(wxPreviewFrame::OnCloseWindow) + EVT_CLOSE(wxPreviewFrame::OnCloseWindow) END_EVENT_TABLE() wxPreviewFrame::wxPreviewFrame(wxPrintPreviewBase *preview, wxFrame *parent, const wxString& title, @@ -447,10 +455,10 @@ wxPreviewFrame::~wxPreviewFrame() { } -void wxPreviewFrame::OnCloseWindow(wxCloseEvent& event) +void wxPreviewFrame::OnCloseWindow(wxCloseEvent& WXUNUSED(event)) { MakeModal(FALSE); - + // Need to delete the printout and the print preview wxPrintout *printout = m_printPreview->GetPrintout(); if (printout) @@ -461,22 +469,22 @@ void wxPreviewFrame::OnCloseWindow(wxCloseEvent& event) m_printPreview->SetFrame(NULL); } delete m_printPreview; - + Destroy(); } void wxPreviewFrame::Initialize() { CreateStatusBar(); - + CreateCanvas(); CreateControlBar(); - + m_printPreview->SetCanvas(m_previewCanvas); m_printPreview->SetFrame(this); - + // Set layout constraints here - + // Control bar constraints wxLayoutConstraints *c1 = new wxLayoutConstraints; // int w, h; @@ -487,28 +495,28 @@ void wxPreviewFrame::Initialize() #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); - + m_previewCanvas->SetConstraints(c2); - + SetAutoLayout(TRUE); - + MakeModal(TRUE); - + Layout(); } @@ -522,7 +530,7 @@ void wxPreviewFrame::CreateControlBar() long buttons = wxPREVIEW_DEFAULT; if (m_printPreview->GetPrintoutForPrinting()) buttons |= wxPREVIEW_PRINT; - + m_controlBar = new wxPreviewControlBar(m_printPreview, buttons, this, wxPoint(0, 0), wxSize(400, 40)); m_controlBar->CreateButtons(); } @@ -531,29 +539,50 @@ void wxPreviewFrame::CreateControlBar() * Print preview */ -wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout *printout, wxPrintout *printoutForPrinting, wxPrintDialogData *data) +wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintData *data) +{ + if (data) + m_printDialogData = (*data); + + Init(printout, printoutForPrinting); +} + +wxPrintPreviewBase::wxPrintPreviewBase(wxPrintout *printout, + wxPrintout *printoutForPrinting, + wxPrintDialogData *data) +{ + if (data) + m_printDialogData = (*data); + + Init(printout, printoutForPrinting); +} + +void wxPrintPreviewBase::Init(wxPrintout *printout, + wxPrintout *printoutForPrinting) { m_isOk = TRUE; m_previewPrintout = printout; if (m_previewPrintout) m_previewPrintout->SetIsPreview(TRUE); - + m_printPrintout = printoutForPrinting; - if (data) - m_printDialogData = (*data); - + m_previewCanvas = NULL; m_previewFrame = NULL; m_previewBitmap = NULL; m_currentPage = 1; - m_currentZoom = 30; + m_currentZoom = 70; m_topMargin = 40; m_leftMargin = 40; m_pageWidth = 0; m_pageHeight = 0; - - printout->OnPreparePrinting(); - + 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); @@ -573,17 +602,18 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum) { if (m_currentPage == pageNum) return TRUE; - + m_currentPage = pageNum; if (m_previewBitmap) { delete m_previewBitmap; m_previewBitmap = NULL; } - + if (m_previewCanvas) { - RenderPage(pageNum); + if (!RenderPage(pageNum)) + return FALSE; m_previewCanvas->Refresh(); } return TRUE; @@ -592,109 +622,122 @@ bool wxPrintPreviewBase::SetCurrentPage(int pageNum) bool wxPrintPreviewBase::PaintPage(wxWindow *canvas, wxDC& dc) { DrawBlankPage(canvas, dc); - + if (!m_previewBitmap) - RenderPage(m_currentPage); - + if (!RenderPage(m_currentPage)) + return FALSE; + if (!m_previewBitmap) return FALSE; - + if (!canvas) return FALSE; - + int canvasWidth, canvasHeight; canvas->GetSize(&canvasWidth, &canvasHeight); - + double zoomScale = ((float)m_currentZoom/(float)100); double actualWidth = (zoomScale*m_pageWidth*m_previewScale); // float actualHeight = (float)(zoomScale*m_pageHeight*m_previewScale); - + int x = (int) ((canvasWidth - actualWidth)/2.0); if (x < m_leftMargin) x = m_leftMargin; int y = m_topMargin; - + wxMemoryDC temp_dc; temp_dc.SelectObject(*m_previewBitmap); - + dc.Blit(x, y, m_previewBitmap->GetWidth(), m_previewBitmap->GetHeight(), &temp_dc, 0, 0); - + temp_dc.SelectObject(wxNullBitmap); - + return 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); - + double zoomScale = (m_currentZoom/100.0); 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; } } - + wxMemoryDC memoryDC; memoryDC.SelectObject(*m_previewBitmap); - + memoryDC.Clear(); - + m_previewPrintout->SetDC(&memoryDC); m_previewPrintout->SetPageSizePixels(m_pageWidth, m_pageHeight); - + + // Need to delay OnPreparePrinting until here, so we have enough information. + if (!m_printingPrepared) + { + m_previewPrintout->OnPreparePrinting(); + m_printingPrepared = TRUE; + } + m_previewPrintout->OnBeginPrinting(); if (!m_previewPrintout->OnBeginDocument(m_printDialogData.GetFromPage(), m_printDialogData.GetToPage())) { wxMessageBox(_("Could not start document preview."), _("Print Preview Failure"), wxOK); - + memoryDC.SelectObject(wxNullBitmap); - + delete m_previewBitmap; + m_previewBitmap = NULL; return FALSE; } - + m_previewPrintout->OnPrintPage(pageNum); m_previewPrintout->OnEndDocument(); m_previewPrintout->OnEndPrinting(); - + m_previewPrintout->SetDC(NULL); - + memoryDC.SelectObject(wxNullBitmap); - - char buf[200]; + + wxChar buf[200]; if (m_maxPage != 0) - sprintf(buf, _("Page %d of %d"), pageNum, m_maxPage); + wxSprintf(buf, _("Page %d of %d"), pageNum, m_maxPage); else - sprintf(buf, _("Page %d"), pageNum); - + wxSprintf(buf, _("Page %d"), pageNum); + if (m_previewFrame) m_previewFrame->SetStatusText(buf); - + return TRUE; } @@ -703,16 +746,16 @@ bool wxPrintPreviewBase::DrawBlankPage(wxWindow *canvas, wxDC& dc) { int canvasWidth, canvasHeight; canvas->GetSize(&canvasWidth, &canvasHeight); - + float zoomScale = (float)((float)m_currentZoom/(float)100); float actualWidth = zoomScale*m_pageWidth*m_previewScale; float actualHeight = zoomScale*m_pageHeight*m_previewScale; - + float x = (float)((canvasWidth - actualWidth)/2.0); if (x < m_leftMargin) x = (float)m_leftMargin; float y = (float)m_topMargin; - + // Draw shadow, allowing for 1-pixel border AROUND the actual page int shadowOffset = 4; dc.SetPen(*wxBLACK_PEN); @@ -722,20 +765,20 @@ bool wxPrintPreviewBase::DrawBlankPage(wxWindow *canvas, wxDC& dc) */ dc.DrawRectangle((int)(x + shadowOffset), (int)(y + actualHeight+1), (int)(actualWidth), shadowOffset); dc.DrawRectangle((int)(x + actualWidth), (int)(y + shadowOffset), shadowOffset, (int)(actualHeight)); - + // Draw blank page allowing for 1-pixel border AROUND the actual page dc.SetPen(*wxBLACK_PEN); dc.SetBrush(*wxWHITE_BRUSH); - + /* wxRegion update_region = canvas->GetUpdateRegion(); wxRect r = update_region.GetBox(); - + printf( "x: %d y: %d w: %d h: %d.\n", (int)r.x, (int)r.y, (int)r.width, (int)r.height ); */ - + dc.DrawRectangle((int)(x-2), (int)(y-1), (int)(actualWidth+3), (int)(actualHeight+2)); - + return TRUE; } @@ -743,19 +786,21 @@ void wxPrintPreviewBase::SetZoom(int percent) { if (m_currentZoom == percent) return; - + m_currentZoom = percent; if (m_previewBitmap) { delete m_previewBitmap; m_previewBitmap = NULL; } - RenderPage(m_currentPage); - + if (m_previewCanvas) { + RenderPage(m_currentPage); + ((wxScrolledWindow *) m_previewCanvas)->Scroll(0, 0); m_previewCanvas->Clear(); m_previewCanvas->Refresh(); } } +#endif // wxUSE_PRINTING_ARCHITECTURE