1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#include "clPrintout.h"
#include "cl_editor.h"
//----------------------------------------------------------------------------
// clPrintout
//----------------------------------------------------------------------------
extern wxPageSetupDialogData* g_pageSetupData;
clPrintout::clPrintout(LEditor* edit, const wxString& title)
: wxPrintout(title)
, m_minPage(0)
, m_maxPage(0)
{
m_edit = edit;
m_printed = 0;
}
bool clPrintout::OnPrintPage(int page)
{
wxDC* dc = GetDC();
if(!dc) return false;
// scale DC
PrintScaling(dc);
// print page
if(page == 1) m_printed = 0;
m_printed = m_edit->FormatRange(1, m_printed, m_edit->GetLength(), dc, dc, m_printRect, m_pageRect);
return true;
}
bool clPrintout::OnBeginDocument(int startPage, int endPage)
{
if(!wxPrintout::OnBeginDocument(startPage, endPage)) {
return false;
}
return true;
}
void clPrintout::GetPageInfo(int* minPage, int* maxPage, int* selPageFrom, int* selPageTo)
{
// initialize values
*minPage = 0;
*maxPage = 0;
*selPageFrom = 0;
*selPageTo = 0;
// scale DC if possible
wxDC* dc = GetDC();
if(!dc) return;
PrintScaling(dc);
// get print page informations and convert to printer pixels
wxSize ppiScr;
GetPPIScreen(&ppiScr.x, &ppiScr.y);
wxSize page = g_pageSetupData->GetPaperSize();
page.x = static_cast<int>(page.x * ppiScr.x / 25.4);
page.y = static_cast<int>(page.y * ppiScr.y / 25.4);
m_pageRect = wxRect(0, 0, page.x, page.y);
// get margins informations and convert to printer pixels
wxPoint pt = g_pageSetupData->GetMarginTopLeft();
int left = pt.x;
int top = pt.y;
pt = g_pageSetupData->GetMarginBottomRight();
int right = pt.x;
int bottom = pt.y;
top = static_cast<int>(top * ppiScr.y / 25.4);
bottom = static_cast<int>(bottom * ppiScr.y / 25.4);
left = static_cast<int>(left * ppiScr.x / 25.4);
right = static_cast<int>(right * ppiScr.x / 25.4);
m_printRect = wxRect(left, top, page.x - (left + right), page.y - (top + bottom));
// count pages
while((m_printed < m_edit->GetLength())) {
m_printed = m_edit->FormatRange(0, m_printed, m_edit->GetLength(), dc, dc, m_printRect, m_pageRect);
*maxPage += 1;
}
if(*maxPage > 0) *minPage = 1;
*selPageFrom = *minPage;
*selPageTo = *maxPage;
m_minPage = *minPage;
m_maxPage = *maxPage;
}
bool clPrintout::HasPage(int page) { return (page >= m_minPage) && (page <= m_maxPage); }
bool clPrintout::PrintScaling(wxDC* dc)
{
// check for dc, return if none
if(!dc) return false;
// get printer and screen sizing values
wxSize ppiScr;
GetPPIScreen(&ppiScr.x, &ppiScr.y);
if(ppiScr.x == 0) { // most possible guess 96 dpi
ppiScr.x = 96;
ppiScr.y = 96;
}
wxSize ppiPrt;
GetPPIPrinter(&ppiPrt.x, &ppiPrt.y);
if(ppiPrt.x == 0) { // scaling factor to 1
ppiPrt.x = ppiScr.x;
ppiPrt.y = ppiScr.y;
}
wxSize dcSize = dc->GetSize();
wxSize pageSize;
GetPageSizePixels(&pageSize.x, &pageSize.y);
// set user scale
float scale_x = (float)(ppiPrt.x * dcSize.x) / (float)(ppiScr.x * pageSize.x);
float scale_y = (float)(ppiPrt.y * dcSize.y) / (float)(ppiScr.y * pageSize.y);
dc->SetUserScale(scale_x, scale_y);
return true;
}
|