void wxRichTextPrintout::RenderPage(wxDC *dc, int page) { if (!GetRichTextBuffer()) return; wxBusyCursor wait; wxRect textRect, headerRect, footerRect; /// Sets the DC scaling and returns important page rectangles CalculateScaling(dc, textRect, headerRect, footerRect); if (page > 1 || m_headerFooterData.GetShowOnFirstPage()) { if (m_headerFooterData.GetFont().Ok()) dc->SetFont(m_headerFooterData.GetFont()); else dc->SetFont(*wxNORMAL_FONT); if (m_headerFooterData.GetTextColour().Ok()) dc->SetTextForeground(m_headerFooterData.GetTextColour()); else dc->SetTextForeground(*wxBLACK); dc->SetBackgroundMode(wxTRANSPARENT); // Draw header, if any wxRichTextOddEvenPage oddEven = ((page % 2) == 1) ? wxRICHTEXT_PAGE_ODD : wxRICHTEXT_PAGE_EVEN; wxString headerTextCentre = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_CENTRE); wxString headerTextLeft = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_LEFT); wxString headerTextRight = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_RIGHT); if (!headerTextLeft.IsEmpty()) { SubstituteKeywords(headerTextLeft, GetTitle(), page, m_numPages); //int tx, ty; //dc->GetTextExtent(headerTextLeft, & tx, & ty); int x = headerRect.GetLeft(); int y = headerRect.GetX(); dc->DrawText(headerTextLeft, x, y); } if (!headerTextCentre.IsEmpty()) { SubstituteKeywords(headerTextCentre, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(headerTextCentre, & tx, & ty); int x = headerRect.GetWidth()/2 - tx/2 + headerRect.GetLeft(); int y = headerRect.GetY(); dc->DrawText(headerTextCentre, x, y); } if (!headerTextRight.IsEmpty()) { SubstituteKeywords(headerTextRight, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(headerTextRight, & tx, & ty); int x = headerRect.GetRight() - tx; int y = headerRect.GetY(); dc->DrawText(headerTextRight, x, y); } // Draw footer, if any wxString footerTextCentre = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_CENTRE); wxString footerTextLeft = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_LEFT); wxString footerTextRight = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_RIGHT); if (!footerTextLeft.IsEmpty()) { SubstituteKeywords(footerTextLeft, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(footerTextLeft, & tx, & ty); int x = footerRect.GetLeft(); int y = footerRect.GetBottom() - ty; dc->DrawText(footerTextLeft, x, y); } if (!footerTextCentre.IsEmpty()) { SubstituteKeywords(footerTextCentre, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(footerTextCentre, & tx, & ty); int x = footerRect.GetWidth()/2 - tx/2 + footerRect.GetLeft(); int y = footerRect.GetBottom() - ty; dc->DrawText(footerTextCentre, x, y); } if (!footerTextRight.IsEmpty()) { SubstituteKeywords(footerTextRight, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(footerTextRight, & tx, & ty); int x = footerRect.GetRight() - tx; int y = footerRect.GetBottom() - ty; dc->DrawText(footerTextRight, x, y); } } wxRichTextRange rangeToDraw(m_pageBreaksStart[page-1], m_pageBreaksEnd[page-1]); GetRichTextBuffer()->Draw(*dc, rangeToDraw, wxRichTextRange(-1,-1), textRect, 0 /* descent */, wxRICHTEXT_DRAW_IGNORE_CACHE /* flags */); }
void wxRichTextPrintout::RenderPage(wxDC *dc, int page) { if (!GetRichTextBuffer()) return; wxBusyCursor wait; wxRect textRect, headerRect, footerRect; /// Sets the DC scaling and returns important page rectangles CalculateScaling(dc, textRect, headerRect, footerRect); if (page > 1 || m_headerFooterData.GetShowOnFirstPage()) { if (m_headerFooterData.GetFont().IsOk()) dc->SetFont(m_headerFooterData.GetFont()); else dc->SetFont(*wxNORMAL_FONT); if (m_headerFooterData.GetTextColour().IsOk()) dc->SetTextForeground(m_headerFooterData.GetTextColour()); else dc->SetTextForeground(*wxBLACK); dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT); // Draw header, if any wxRichTextOddEvenPage oddEven = ((page % 2) == 1) ? wxRICHTEXT_PAGE_ODD : wxRICHTEXT_PAGE_EVEN; wxString headerTextCentre = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_CENTRE); wxString headerTextLeft = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_LEFT); wxString headerTextRight = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_RIGHT); if (!headerTextLeft.IsEmpty()) { SubstituteKeywords(headerTextLeft, GetTitle(), page, m_numPages); //int tx, ty; //dc->GetTextExtent(headerTextLeft, & tx, & ty); int x = headerRect.GetLeft(); int y = headerRect.GetX(); dc->DrawText(headerTextLeft, x, y); } if (!headerTextCentre.IsEmpty()) { SubstituteKeywords(headerTextCentre, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(headerTextCentre, & tx, & ty); int x = headerRect.GetWidth()/2 - tx/2 + headerRect.GetLeft(); int y = headerRect.GetY(); dc->DrawText(headerTextCentre, x, y); } if (!headerTextRight.IsEmpty()) { SubstituteKeywords(headerTextRight, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(headerTextRight, & tx, & ty); int x = headerRect.GetRight() - tx; int y = headerRect.GetY(); dc->DrawText(headerTextRight, x, y); } // Draw footer, if any wxString footerTextCentre = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_CENTRE); wxString footerTextLeft = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_LEFT); wxString footerTextRight = m_headerFooterData.GetFooterText(oddEven, wxRICHTEXT_PAGE_RIGHT); if (!footerTextLeft.IsEmpty()) { SubstituteKeywords(footerTextLeft, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(footerTextLeft, & tx, & ty); int x = footerRect.GetLeft(); int y = footerRect.GetBottom() - ty; dc->DrawText(footerTextLeft, x, y); } if (!footerTextCentre.IsEmpty()) { SubstituteKeywords(footerTextCentre, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(footerTextCentre, & tx, & ty); int x = footerRect.GetWidth()/2 - tx/2 + footerRect.GetLeft(); int y = footerRect.GetBottom() - ty; dc->DrawText(footerTextCentre, x, y); } if (!footerTextRight.IsEmpty()) { SubstituteKeywords(footerTextRight, GetTitle(), page, m_numPages); int tx, ty; dc->GetTextExtent(footerTextRight, & tx, & ty); int x = footerRect.GetRight() - tx; int y = footerRect.GetBottom() - ty; dc->DrawText(footerTextRight, x, y); } } wxRichTextRange rangeToDraw(m_pageBreaksStart[page-1], m_pageBreaksEnd[page-1]); wxPoint oldOrigin = dc->GetLogicalOrigin(); double scaleX, scaleY; dc->GetUserScale(& scaleX, & scaleY); int yOffset = 0; if (page > 1) yOffset = m_pageYOffsets[page-2]; if (yOffset != oldOrigin.y) dc->SetLogicalOrigin(oldOrigin.x, oldOrigin.y + yOffset); dc->SetClippingRegion(wxRect(textRect.x, textRect.y + yOffset, textRect.width, textRect.height)); wxRichTextDrawingContext context(GetRichTextBuffer()); GetRichTextBuffer()->Draw(*dc, context, rangeToDraw, wxRichTextSelection(), textRect, 0 /* descent */, wxRICHTEXT_DRAW_IGNORE_CACHE|wxRICHTEXT_DRAW_PRINT /* flags */); dc->DestroyClippingRegion(); if (yOffset != oldOrigin.y) dc->SetLogicalOrigin(oldOrigin.x, oldOrigin.y); }