m_pageBreaksStart.Clear();
m_pageBreaksEnd.Clear();
-
+
int lastStartPos = 0;
-
+
wxRect rect, headerRect, footerRect;
/// Sets the DC scaling and returns important page rectangles
GetRichTextBuffer()->Invalidate(wxRICHTEXT_ALL);
GetRichTextBuffer()->Layout(*GetDC(), rect, wxRICHTEXT_FIXED_WIDTH|wxRICHTEXT_VARIABLE_HEIGHT);
-
+
// Now calculate the page breaks
-
+
int yOffset = 0;
-
+
wxRichTextLine* lastLine = NULL;
-
+
wxRichTextObjectList::compatibility_iterator node = GetRichTextBuffer()->GetChildren().GetFirst();
while (node)
{
// child is a paragraph
wxRichTextParagraph* child = wxDynamicCast(node->GetData(), wxRichTextParagraph);
wxASSERT (child != NULL);
-
+
wxRichTextLineList::compatibility_iterator node2 = child->GetLines().GetFirst();
while (node2)
{
line->SetPosition(wxPoint(line->GetPosition().x, line->GetPosition().y - yOffset));
int lineY = child->GetPosition().y + line->GetPosition().y;
-
+
// Break the page if either we're going off the bottom, or this paragraph specifies
// an explicit page break
-
+
if (((lineY + line->GetSize().y) > rect.GetBottom()) ||
((node2 == child->GetLines().GetFirst()) && child->GetAttributes().HasPageBreak()))
{
// New page starting at this line
int newY = rect.y;
-
+
// We increase the offset by the difference between new and old positions
-
+
int increaseOffsetBy = lineY - newY;
yOffset += increaseOffsetBy;
-
+
line->SetPosition(wxPoint(line->GetPosition().x, newY - child->GetPosition().y));
if (!lastLine)
lastLine = line;
-
+
m_pageBreaksStart.Add(lastStartPos);
m_pageBreaksEnd.Add(lastLine->GetAbsoluteRange().GetEnd());
-
+
lastStartPos = line->GetAbsoluteRange().GetStart();
-
+
m_numPages ++;
}
-
+
lastLine = line;
node2 = node2->GetNext();
return;
wxBusyCursor wait;
-
+
wxRect textRect, headerRect, footerRect;
/// Sets the DC scaling and returns important page rectangles
dc->SetTextForeground(*wxBLACK);
dc->SetBackgroundMode(wxBRUSHSTYLE_TRANSPARENT);
- // Draw header, if any
+ // Draw header, if any
wxRichTextOddEvenPage oddEven = ((page % 2) == 1) ? wxRICHTEXT_PAGE_ODD : wxRICHTEXT_PAGE_EVEN;
wxString headerTextCentre = m_headerFooterData.GetHeaderText(oddEven, wxRICHTEXT_PAGE_CENTRE);
//int tx, ty;
//dc->GetTextExtent(headerTextLeft, & tx, & ty);
-
+
int x = headerRect.GetLeft();
int y = headerRect.GetX();
dc->DrawText(headerTextLeft, x, y);
dc->DrawText(headerTextRight, x, y);
}
- // Draw footer, if any
+ // 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);
int y = footerRect.GetBottom() - ty;
dc->DrawText(footerTextRight, x, y);
}
- }
+ }
wxRichTextRange rangeToDraw(m_pageBreaksStart[page-1], m_pageBreaksEnd[page-1]);
int w, h;
dc->GetSize(&w, &h);
GetPageSizePixels(&pageWidth, &pageHeight);
-
+
// If printer pageWidth == current DC width, then this doesn't
// change. But w might be the preview bitmap width, so scale down.
float previewScale = (float)(w/(float)pageWidth);
// during printing to be correct when scaling is applied.
if (!IsPreview())
m_richTextBuffer->SetScale(scale);
-
+
// Calculate margins
int marginLeft = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginLeft);
int marginTop = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginTop);
int marginRight = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginRight);
int marginBottom = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_marginBottom);
-
+
// Header and footer margins
int headerMargin = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_headerFooterData.GetHeaderMargin());
int footerMargin = wxRichTextObject::ConvertTenthsMMToPixels(ppiPrinterX, m_headerFooterData.GetFooterMargin());
-
+
dc->SetUserScale(overallScale, overallScale);
wxRect rect((int) (marginLeft/scale), (int) (marginTop/scale),
(int) ((pageWidth - marginLeft - marginRight)/scale), (int)((pageHeight - marginTop - marginBottom)/scale));
-
+
headerRect = wxRect(0, 0, 0, 0);
if (!m_headerFooterData.GetHeaderText(wxRICHTEXT_PAGE_ODD, wxRICHTEXT_PAGE_LEFT).IsEmpty() ||
dc->SetFont(m_headerFooterData.GetFont());
else
dc->SetFont(*wxNORMAL_FONT);
-
+
int charHeight = dc->GetCharHeight();
-
+
int headerHeight = (int) (charHeight + headerMargin/scale);
headerRect = wxRect(rect.x, rect.y, rect.width, headerHeight);
rect.y += headerHeight;
- rect.height -= headerHeight;
+ rect.height -= headerHeight;
}
footerRect = wxRect(0, 0, 0, 0);
dc->SetFont(m_headerFooterData.GetFont());
else
dc->SetFont(*wxNORMAL_FONT);
-
+
int charHeight = dc->GetCharHeight();
-
+
int footerHeight = (int) (charHeight + footerMargin/scale);
footerRect = wxRect(rect.x, rect.y + rect.height, rect.width, footerHeight);
- rect.height -= footerHeight;
+ rect.height -= footerHeight;
}
textRect = rect;
m_parentWindow = parentWindow;
m_title = name;
m_printData = NULL;
-
+
m_previewRect = wxRect(wxPoint(100, 100), wxSize(800, 800));
m_pageSetupData = new wxPageSetupDialogData;
}
else
SetRichTextBufferPrinting(new wxRichTextBuffer(*m_richTextBufferPreview));
-
+
wxRichTextPrintout *p1 = CreatePrintout();
p1->SetRichTextBuffer(m_richTextBufferPreview);
wxRichTextPrintout *p1 = CreatePrintout();
p1->SetRichTextBuffer(m_richTextBufferPreview);
-
+
wxRichTextPrintout *p2 = CreatePrintout();
p2->SetRichTextBuffer(m_richTextBufferPrinting);